packrat::init("~/Desktop/Heloderma Spatial/Heloderma Spatial")
library(adehabitatHR) #for home range calculations
library(data.table) #manipulate S3 and S4 data tables
data.table 1.11.8  Latest news: r-datatable.com

Attaching package: ‘data.table’

The following objects are masked from ‘package:dplyr’:

    between, first, last

The following object is masked from ‘package:purrr’:

    transpose

The following object is masked from ‘package:raster’:

    shift
library(ggplot2) #for graphic output
library(ggfortify) #to allow ggplot2 to read spatial data
library(grid) #to add annotations to the output
# library(OpenStreetMap) #for obtaining raster images
library(pbapply) #needed for progress bar
package ‘pbapply’ was built under R version 3.5.2
library(plotly) #for interactive xy plot

Attaching package: ‘plotly’

The following objects are masked from ‘package:plyr’:

    arrange, mutate, rename, summarise

The following object is masked from ‘package:ggmap’:

    wind

The following object is masked from ‘package:ordinal’:

    slice

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:MASS’:

    select

The following object is masked from ‘package:raster’:

    select

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(rgdal) #for converting spatial data
package ‘rgdal’ was built under R version 3.5.2rgdal: version: 1.4-3, (SVN revision 828)
 Geospatial Data Abstraction Library extensions to R successfully loaded
 Loaded GDAL runtime: GDAL 2.1.3, released 2017/20/01
 Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rgdal/gdal
 GDAL binary built with GEOS: FALSE 
 Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
 Path to PROJ.4 shared files: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rgdal/proj
 Linking to sp version: 1.3-1 
library(sp) #for converting spatial data
library(rgeos)
rgeos version: 0.4-2, (SVN revision 581)
 GEOS runtime version: 3.6.1-CAPI-1.10.1 
 Linking to sp version: 1.3-1 
 Polygon checking: TRUE 
# library(raster)
library(mapview)

Overall individual yearly home ranges for non/subsidized populations

Gila monster locations for all tracked lizards across Stone Canyon

myMap
768x1280 terrain map image from Stamen Maps. 
See ?ggmap to plot it.

OVERALL YEARLY ANALYSES

Plot of 100% MCP HRs against number of relocations

year <- read_csv("GM_Consolidated_ByYear.csv")
Missing column names filled in: 'X13' [13]Parsed with column specification:
cols(
  Year = col_double(),
  Gila = col_character(),
  Sex = col_character(),
  Environment = col_character(),
  Home_Range_100mcp = col_double(),
  N100 = col_double(),
  Home_Range_95mcp = col_double(),
  N95 = col_double(),
  Home_Range_95kde = col_double(),
  N = col_double(),
  Home_Range_50kde = col_double(),
  N50 = col_double(),
  X13 = col_logical()
)
# quick plot
# Graph1<-ggplot(year,aes(x=N100,y=Home_Range_100mcp,group=Environment))+
Graph1<-ggplot(year,aes(x=N100,y=Home_Range_100mcp))+
  geom_point(aes(shape = factor(Environment)), size = 4)+
  scale_shape_manual(values=c(16, 2))+
  geom_smooth(aes(linetype=Environment),colour="black", method="lm") +
  # scale_colour_manual(values=c(subsidized="cyan3",nonsubsidized="indian red1"))+
  # labs(title = "100% MCP Home Ranges")+
  xlab("Number of Relocations")+
  ylab("100% MCP Area (ha)")+
  # labs(caption = "Figure 3 | Non-Subsidized (Owl Head Buttes) vs. Subsidized (Stone Canyon) population 100% MCPs against number \n of fixes of the complete data set.")+
  theme(plot.caption = element_text(hjust = 0,lineheight = 0.9))
  # theme_bw()
Graph1<-Graph1+theme(axis.title=element_text(size = 18))
# legend at top-left, inside the plot
SCOH.hr.fig<-Graph1 + theme(legend.title = element_blank(),
               legend.text = element_text(size = 14),
               legend.justification=c(0,1),
               legend.position=c(0.05, 0.95),
               legend.background = element_blank(),
               legend.key = element_blank(),
               legend.box.background = element_rect(colour = "black")) +
               scale_shape_discrete(name  ="",
                          breaks=c("nonsubsidized", "subsidized"),
                          labels=c("Nonsubsidized", "Subsidized")) +
                            scale_linetype_discrete(name  ="",
                          breaks=c("nonsubsidized", "subsidized"),
                          labels=c("Nonsubsidized", "Subsidized"))
Scale for 'shape' is already present. Adding another scale for 'shape', which
will replace the existing scale.
SCOH.hr.fig

# dir.create("outputs") # create a new folder to hold the output files
# ggsave("outputs/SC_OHB_plot.pdf")

Plot of 95% KDEs against relocations

Overall combined 100% MCP means averaged across sex

library(Rmisc)
Means <- summarySE(year, measurevar="Home_Range_100mcp",
                          groupvars=c("Environment"),na.rm = TRUE)
kable(Means, format = "pandoc", caption = 'Overall combined 100% MCP means averaged across sex')
Overall combined 100% MCP means averaged across sex
Environment N Home_Range_100mcp sd se ci
nonsubsidized 26 33.44231 20.518658 4.0240400 8.287665
subsidized 53 10.40151 6.948743 0.9544832 1.915311

Overall combined 95% MCP means averaged across sex

Means.95mcp <- summarySE(year, measurevar="Home_Range_95mcp",
                          groupvars=c("Environment"),na.rm = TRUE)
Means.95mcp

Set projection for mapping

CRS.SC<-CRS("+proj=utm +zone=12 +ellps=WGS84 +units=m +no_defs")

Function for MCP analysis

Function of MCP polygons used for mapping

Function of KDE analysis

kde_analysis.href.plot <- function(filename, percentage){
  data <- read.csv(file = filename)
  x <- as.data.frame(data$EASTING)
  y <- as.data.frame(data$NORTHING)
  xy <- c(x,y)
  data.proj <- SpatialPointsDataFrame(xy,data, proj4string = CRS.SC)
  xy <- SpatialPoints(data.proj@coords)
  kde<-kernelUD(xy, h="href", kern="bivnorm", grid=1000)
  ver <- getverticeshr(kde, percentage)
  area <- as.data.frame(round(ver$area,4))
  .rowNamesDF(area, make.names=TRUE) <- data$LIZARDNUMBER
  write.table(area,file="KDE_Hectares.csv",
              append=TRUE,sep=",", col.names=FALSE, row.names=TRUE)
  kde.points <- cbind((data.frame(data.proj@coords)),data$LIZARDNUMBER)
  colnames(kde.points) <- c("x","y","lizardnumber")
  kde.poly <- fortify(ver, region = "id")
  units <- grid.text(paste(round(ver$area,2)," ha"), x=0.9,  y=0.95,
                     gp=gpar(fontface=4, cex=0.9), draw = FALSE)
  kde.plot <- ggplot() +
    geom_polygon(data=kde.poly, aes(x=kde.poly$long, y=kde.poly$lat), alpha = 0.5) +
    geom_point(data=kde.points, aes(x=x, y=y)) + theme_bw() +
    labs(x="Easting (m)", y="Northing (m)", title=kde.points$lizardnumber) +
    theme(legend.position="none", plot.title = element_text(face = "bold", hjust = 0.5)) +
    annotation_custom(units)
  kde.plot
}

Function of KDE polygons for mapping

kde_analysis.href.polygon <- function(filename, percentage){
  data <- read.csv(file = filename)
  x <- as.data.frame(data$EASTING)
  y <- as.data.frame(data$NORTHING)
  xy <- c(x,y)
  data.proj <- SpatialPointsDataFrame(xy,data, proj4string = CRS.SC)
  xy <- SpatialPoints(data.proj@coords)
  kde<-kernelUD(xy, h="href", kern="bivnorm", grid=1000)
  ver <- getverticeshr(kde, percentage)
  ver@proj4string<-CRS.SC
  area <- as.data.frame(round(ver$area,4))
  .rowNamesDF(area, make.names=TRUE) <- data$YEAR
  write.table(area,file="KDE_Hectares.csv",
              append=TRUE,sep=",", col.names=FALSE, row.names=TRUE)
  kde.points <- cbind((data.frame(data.proj@coords)),data$YEAR)
  colnames(kde.points) <- c("x","y","year")
  kde.poly <- fortify(ver, region = "id")
  units <- grid.text(paste(round(ver$area,2)," ha"), x=0.9,  y=0.95,
                     gp=gpar(fontface=4, cex=0.9), draw = FALSE)
  ver
}

Function of raster of UD

# kde_analysis.href.raster <- function(filename){
#   data <- read.csv(file = filename)
#   x <- as.data.frame(data$EASTING)
#   y <- as.data.frame(data$NORTHING)
#   xy <- c(x,y)
#   data.proj <- SpatialPointsDataFrame(xy,data, proj4string = CRS.SC)
#   xy <- SpatialPoints(data.proj@coords)
#   kde<-kernelUD(xy, h="href", kern="bivnorm", grid=1000)
#   kde<-as(kde, "SpatialGridDataFrame")
#   kde@proj4string<- CRS.SC
#   kde
# }

Function of trajectory analysis and distance over time

traj_analysis <- function(filename){
  relocs_data <- read.csv(file = filename)
  relocs <- as.ltraj(cbind(relocs_data$EASTING, relocs_data$NORTHING),id=relocs_data$LIZARDNUMBER, typeII = FALSE, date=NULL)
  relocs.df <- ld(relocs)
  relocs_dist <- as.data.frame(sum(sapply(relocs.df$dist, sum, na.rm=TRUE)))
  colnames(relocs_dist) <- "Total Distance"
  name <- relocs.df$id[1]
  row.names(relocs_dist) <- name
  relocs_units <- grid.text(paste(round(relocs_dist,2),"m"), x=0.9, y=0.9,
                            gp=gpar(fontface=3, col="black", cex=0.9), draw = FALSE)
  reloc.plot <- ggplot() + theme_classic() + geom_path(data=relocs.df, aes(x=x,y=y), linetype = "dashed", colour = "red",
                                                       arrow = arrow(length=unit(.5,"cm"), angle = 20, ends="last", type = "closed")) +
    geom_point(data=relocs.df, aes(x=x, y=y)) + geom_point(data=relocs.df, aes(x=x[1],
                                                                               y=y[1]), size = 3, color = "darkgreen", pch=0) +
    labs(x="Easting (m)", y="Northing (m)", title=relocs.df$id[1]) +
    theme(legend.position="none", plot.title = element_text(face = "bold", hjust = 0.5)) +
    annotation_custom(relocs_units)
  reloc.plot
}

Function of distance of time

dist_analysis <- function(filename){
  relocs_data <- read.csv(file = filename)
  relocs <- as.ltraj(cbind(relocs_data$EASTING, relocs_data$NORTHING),id=relocs_data$LIZARDNUMBER, typeII = FALSE, date=NULL)
  relocs.df <- ld(relocs)
  relocs_dist <- as.data.frame(sum(sapply(relocs.df$dist, sum, na.rm=TRUE)))
  colnames(relocs_dist) <- "Total Distance"
  name <- relocs.df$id[1]
  row.names(relocs_dist) <- name
  write.table(relocs_dist,file="reloc_dist.csv",
              append=TRUE,sep=",", col.names=FALSE, row.names=TRUE)
  dist.plot
}

Map of yearly HR shifts of a subset of Gila Monsters. Includes running MCP polygons, Fortify mcp polygons for ggplot2 by YEAR

Raw group 100% MCP home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex

Table 1 | Raw group 100% MCP home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.
Environment Sex N Home_Range_100mcp sd se ci
nonsubsidized female 11 22.063636 12.287414 3.704795 8.254797
nonsubsidized male 14 43.235714 21.672372 5.792185 12.513255
subsidized female 38 9.839474 6.889003 1.117544 2.264359
subsidized male 15 11.825333 7.133668 1.841905 3.950494

Raw group 95% MCP home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex

YR_GRP_Means95 <- summarySE(year, measurevar="Home_Range_95mcp",
                            groupvars=c("Environment","Sex"),na.rm = TRUE)
kable(YR_GRP_Means95, format = "pandoc", caption = 'Table 2 | Raw group 95% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.')
Table 2 | Raw group 95% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.
Environment Sex N Home_Range_95mcp sd se ci
nonsubsidized female 6 20.600000 6.286493 2.566450 6.597270
nonsubsidized male 9 38.988889 15.815139 5.271713 12.156592
subsidized female 38 7.132895 4.280606 0.694406 1.407000
subsidized male 15 9.195333 5.246499 1.354640 2.905415

RM-ANOVA for 100% MCP analyses between the subsidized and non-subsidized

summary(RMmod.year)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: Home_Range_100mcp ~ Environment + Year + Sex + N100 + Environment *  
    Sex + (1 | Gila)
   Data: year

REML criterion at convergence: 578.7

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.51737 -0.36103 -0.04818  0.24140  3.14258 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 37.23    6.101   
 Residual             85.97    9.272   
Number of obs: 79, groups:  Gila, 31

Fixed effects:
                                Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                   -991.17075 1749.77011   67.87392  -0.566  0.57295    
Environmentsubsidized          -15.35332    8.57337   69.12686  -1.791  0.07770 .  
Year                             0.50199    0.87435   67.88010   0.574  0.56778    
Sexmale                         17.19067    5.06107   24.45954   3.397  0.00233 ** 
N100                             0.18371    0.04247   52.43447   4.326 6.84e-05 ***
Environmentsubsidized:Sexmale  -12.12232    6.51056   25.59879  -1.862  0.07413 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm Year   Sexmal N100  
Envrnmntsbs  0.851                            
Year        -1.000 -0.852                     
Sexmale     -0.031  0.298  0.029              
N100         0.069  0.124 -0.070 -0.057       
Envrnmnts:S  0.031 -0.317 -0.030 -0.782  0.126

ANOVA table for 100% MCPs between the two populations

anova(RMmod.year)
Type III Analysis of Variance Table with Satterthwaite's method
                 Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment      593.69  593.69     1 72.975  6.9058  0.010467 *  
Year              28.34   28.34     1 67.880  0.3296  0.567782    
Sex             1019.81 1019.81     1 24.480 11.8624  0.002073 ** 
N100            1608.73 1608.73     1 52.434 18.7127 6.841e-05 ***
Environment:Sex  298.04  298.04     1 25.599  3.4668  0.074129 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

RM-ANOVA for 95% MCP analyses between the subsidized and non-subsidized

summary(RMmod.year95)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: Home_Range_95mcp ~ Environment + Year + Sex + N95 + Environment *  
    Sex + (1 | Gila)
   Data: year

REML criterion at convergence: 427

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.40965 -0.32439 -0.01753  0.33170  2.10809 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 62.74    7.921   
 Residual             14.71    3.835   
Number of obs: 68, groups:  Gila, 31

Fixed effects:
                                Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                   -847.23191  832.90246   36.03605  -1.017 0.315837    
Environmentsubsidized          -17.57933    5.60239   56.19888  -3.138 0.002710 ** 
Year                             0.43227    0.41610   36.03494   1.039 0.305791    
Sexmale                         18.07841    4.86595   26.11740   3.715 0.000973 ***
N95                              0.03418    0.03342   37.01539   1.023 0.313095    
Environmentsubsidized:Sexmale  -11.52577    5.79029   33.81958  -1.991 0.054663 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm Year   Sexmal N95   
Envrnmntsbs  0.598                            
Year        -1.000 -0.602                     
Sexmale     -0.025  0.454  0.021              
N95         -0.003  0.254  0.000 -0.027       
Envrnmnts:S  0.004 -0.490 -0.001 -0.841  0.064

ANOVA table for 95% MCPs between the two populations

anova(RMmod.year95)
Type III Analysis of Variance Table with Satterthwaite's method
                Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment     335.56  335.56     1 61.986 22.8175 1.131e-05 ***
Year             15.87   15.87     1 36.035  1.0792 0.3057907    
Sex             266.80  266.80     1 33.473 18.1420 0.0001568 ***
N95              15.38   15.38     1 37.015  1.0459 0.3130948    
Environment:Sex  58.27   58.27     1 33.820  3.9622 0.0546634 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Raw group means AND adjusted EMMs of Yearly Overall 100%MCP

Directional means of home range (100% MCP) after being adjusted for year, sex and sample size

kable(ref_dfRM_sex, format = "pandoc", caption = 'Table | Directional means of home range (100% MCP) after being adjusted for year, sex and sample size.')
Table | Directional means of home range (100% MCP) after being adjusted for year, sex and sample size.
Environment Sex lsmean SE df lower.CL upper.CL
nonsubsidized female 23.872887 6.030104 67.38353 11.838009 35.90777
subsidized female 8.300524 3.305743 48.63495 1.656123 14.94493
nonsubsidized male 43.544702 6.077155 66.92800 31.414411 55.67499
subsidized male 13.421268 4.084847 54.24885 5.232502 21.61003
summary(RM.95KDEmod.year)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: Home_Range_95kde ~ Environment + Year + Sex + N + Environment *  
    Sex + (1 | Gila)
   Data: year

REML criterion at convergence: 450.5

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.48925 -0.42071 -0.07388  0.41738  2.69609 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 175.44   13.25   
 Residual              60.06    7.75   
Number of obs: 61, groups:  Gila, 29

Fixed effects:
                                Estimate Std. Error         df t value Pr(>|t|)   
(Intercept)                   -1.565e+03  1.778e+03  3.477e+01  -0.880  0.38490   
Environmentsubsidized         -2.190e+01  1.132e+01  5.238e+01  -1.934  0.05856 . 
Year                           8.007e-01  8.883e-01  3.479e+01   0.901  0.37356   
Sexmale                        3.244e+01  9.318e+00  2.798e+01   3.481  0.00166 **
N                             -1.727e-02  7.301e-02  3.873e+01  -0.237  0.81428   
Environmentsubsidized:Sexmale -1.805e+01  1.161e+01  2.512e+01  -1.554  0.13264   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm Year   Sexmal N     
Envrnmntsbs  0.616                            
Year        -1.000 -0.620                     
Sexmale      0.000  0.473 -0.003              
N            0.040  0.357 -0.044  0.074       
Envrnmnts:S  0.017 -0.476 -0.015 -0.796  0.026
anova(RM.95KDEmod.year)
Type III Analysis of Variance Table with Satterthwaite's method
                Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment     578.08  578.08     1 54.632  9.6250 0.0030363 ** 
Year             48.80   48.80     1 34.786  0.8126 0.3735574    
Sex             956.52  956.52     1 26.005 15.9260 0.0004788 ***
N                 3.36    3.36     1 38.732  0.0559 0.8142796    
Environment:Sex 145.08  145.08     1 25.121  2.4156 0.1326414    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

RM-ANOVA of 95% KDEs for the subsidized population

RM.KDEmod.year<-lmer(Home_Range_95kde~Year+Sex+N+(1|Gila),data = sub)

summary(RM.KDEmod.year)

ANOVA Table for 95%KDE

anova(RM.KDEmod.year)
Type III Analysis of Variance Table with Satterthwaite's method
     Sum Sq Mean Sq NumDF  DenDF F value   Pr(>F)   
Year  33.20   33.20     1 40.016  0.5720 0.453900   
Sex  496.66  496.66     1 17.763  8.5562 0.009132 **
N     21.33   21.33     1 37.608  0.3675 0.548005   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

RM-ANOVA of 50% KDEs for the subsidized

RM.KDE.50.mod.year<-lmer(Home_Range_50kde~Year+Sex+N+(1|Gila),data = sub)

summary(RM.KDE.50.mod.year)

ANOVA Talbe of 50% KDE for the subsidized

anova(RM.KDE.50.mod.year)

TABLE. Raw Group 50% KDE home range means male and female home ranges at Stone Canyon

YR_GRP_Means.50KDE <- summarySE(sub, measurevar="Home_Range_50kde",
                            groupvars=c("Sex"),na.rm = TRUE)

kable(YR_GRP_Means.50KDE, format = "pandoc", caption = 'Table 5 | Raw Group 50% KDE home range means male and female home ranges at Stone Canyon.')

Raw group means AND adjusted EMMs of Yearly Overall 95% KDEs between non/subsidized populations

Collective grid of 100% MCP and 95% KDE of both sites from above

43.4 male 42.9 female Yearly overall means of 95% KDEs grouped by site and sex

YR_Means.95KDEall <- summarySE(year, measurevar="Home_Range_95kde",
                            groupvars=c("Environment","Sex"),na.rm = TRUE)
 
kable(YR_Means.95KDEall, format = "pandoc", caption = 'Table | Raw Group 95% KDE home range means male and female home ranges at non/subsidized.')
Table | Raw Group 95% KDE home range means male and female home ranges at non/subsidized.
Environment Sex N Home_Range_95kde sd se ci
nonsubsidized female 5 36.80000 9.603905 4.294997 11.924824
nonsubsidized male 6 69.40000 27.763789 11.334520 29.136310
subsidized female 37 22.98892 11.046272 1.815996 3.683010
subsidized male 13 35.00308 12.057546 3.344161 7.286302

Pairwise Comparisons, between sexes by environment, and between environments averaged across sex

emm_s.TK
$emmeans
Sex = female:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  23.76 6.25 68.3    11.29     36.2
 subsidized      8.41 3.47 49.8     1.45     15.4

Sex = male:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  40.95 6.17 69.7    28.65     53.3
 subsidized     13.48 4.27 55.3     4.91     22.0

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Sex = female:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     15.4 8.72 70.5 1.761   0.0826 

Sex = male:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     27.5 9.13 71.7 3.009   0.0036 

Graphical Comparisons of Sex Within Each Environment:

plot(emm_s.t2, comparisons = TRUE, xlab = "Least Square Mean (ha)", ylab = "Environment")

Pairwise by sex between enviornements 100% MCP, and 95% KDEs

emm_s.t3
$emmeans
Sex = female:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  23.76 6.25 68.3    11.29     36.2
 subsidized      8.41 3.47 49.8     1.45     15.4

Sex = male:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  40.95 6.17 69.7    28.65     53.3
 subsidized     13.48 4.27 55.3     4.91     22.0

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Sex = female:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     15.4 8.72 70.5 1.761   0.0826 

Sex = male:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     27.5 9.13 71.7 3.009   0.0036 

Graphical Comparisons of Sex between the two populations:

plot(emm_s.t3, comparisons = TRUE, xlab = "Least Square Mean (ha)", ylab = "Environment")

Ineractive map of MCPs at Stone Canyon

Create stagnant stamen map of MCPs at Stone Canyon

Error: Don't know how to add north2(SC_stamen_map, x = 0.89, y = 0.85, scale = 0.1, symbol = 16) to a plot

myMap
768x1280 terrain map image from Stamen Maps. 
See ?ggmap to plot it.

Interactive map of KDEs at Stone Canyon

TABLE

Table | Subsidized and non-subsidized directional means of KDE home ranges after being adjusted for year, sex and sample size.
Environment Sex lsmean SE df lower.CL upper.CL
nonsubsidized female 42.44837 9.346459 53.01148 23.70185 61.19490
subsidized female 20.93992 4.083131 22.92042 12.49169 29.38814
nonsubsidized male 80.81873 9.084540 52.50968 62.59348 99.04398
subsidized male 35.27439 5.501543 29.24014 24.02648 46.52229

SEASONAL ANALYSES

Map of seasonal fluctions of home ranges

## Create MCP polygons by SEASON:
M215_mcp.EM<-mcp_analysis.POLY("./M215/Emergence .csv", percentage= 100)
M215_mcp.DRY<-mcp_analysis.POLY("./M215/Dry .csv", percentage= 100)
M215_mcp.MON<-mcp_analysis.POLY("./M215/Monsoon .csv", percentage= 100)

M112_mcp.DRY<-mcp_analysis.POLY("./M112/Dry .csv", percentage= 100)
M112_mcp.MON<-mcp_analysis.POLY("./M112/Monsoon .csv", percentage= 100)
M112_mcp.PM<-mcp_analysis.POLY("./M112/Post_Monsoon .csv", percentage= 100)

M119_mcp.DRY<-mcp_analysis.POLY("./M119/Dry .csv", percentage= 100)
M119_mcp.MON<-mcp_analysis.POLY("./M119/Monsoon .csv", percentage= 100)
M119_mcp.PM<-mcp_analysis.POLY("./M119/Post_Monsoon .csv", percentage= 100)

F114_mcp.EM<-mcp_analysis.POLY("./F114/Emergence .csv", percentage= 100)
F114_mcp.DRY<-mcp_analysis.POLY("./F114/Dry .csv", percentage= 100)
F114_mcp.MON<-mcp_analysis.POLY("./F114/Monsoon .csv", percentage= 100)
F114_mcp.PM<-mcp_analysis.POLY("./F114/Post_Monsoon .csv", percentage= 100)

F137_mcp.EM<-mcp_analysis.POLY("./F137/Emergence .csv", percentage= 100)
F137_mcp.DRY<-mcp_analysis.POLY("./F137/Dry .csv", percentage= 100)
F137_mcp.MON<-mcp_analysis.POLY("./F137/Monsoon .csv", percentage= 100)
F137_mcp.PM<-mcp_analysis.POLY("./F137/Post_Monsoon .csv", percentage= 100)

F147_mcp.EM<-mcp_analysis.POLY("./F147/Emergence .csv", percentage= 100)
F147_mcp.DRY<-mcp_analysis.POLY("./F147/Dry .csv", percentage= 100)
F147_mcp.MON<-mcp_analysis.POLY("./F147/Monsoon .csv", percentage= 100)
F147_mcp.PM<-mcp_analysis.POLY("./F147/Post_Monsoon .csv", percentage= 100)

F252_mcp.EM<-mcp_analysis.POLY("./F252/Emergence .csv", percentage= 100)
F252_mcp.DRY<-mcp_analysis.POLY("./F252/Dry .csv", percentage= 100)
F252_mcp.MON<-mcp_analysis.POLY("./F252/Monsoon .csv", percentage= 100)
F252_mcp.PM<-mcp_analysis.POLY("./F252/Post_Monsoon .csv", percentage= 100)

F36_mcp.EM<-mcp_analysis.POLY("./F36/Emergence .csv", percentage= 100)
F36_mcp.DRY<-mcp_analysis.POLY("./F36/Dry .csv", percentage= 100)
F36_mcp.MON<-mcp_analysis.POLY("./F36/Monsoon .csv", percentage= 100)
F36_mcp.PM<-mcp_analysis.POLY("./F36/Post_Monsoon .csv", percentage= 100)

F66_mcp.EM<-mcp_analysis.POLY("./F66/Emergence .csv", percentage= 100)
F66_mcp.DRY<-mcp_analysis.POLY("./F66/Dry .csv", percentage= 100)
F66_mcp.MON<-mcp_analysis.POLY("./F66/Monsoon .csv", percentage= 100)
F66_mcp.PM<-mcp_analysis.POLY("./F66/Post_Monsoon .csv", percentage= 100)

## Fortify mcp polygons for ggplot2 *SEASON*:
M215_mcp.EMT <- fortify(M215_mcp.EM, region = "id")
M215_mcp.DRYT <- fortify(M215_mcp.DRY, region = "id")
M215_mcp.MONT <- fortify(M215_mcp.MON, region = "id")

M112_mcp.DRYT <- fortify(M112_mcp.DRY, region = "id")
M112_mcp.MONT <- fortify(M112_mcp.MON, region = "id")
M112_mcp.PMT <- fortify(M112_mcp.PM, region = "id")

M119_mcp.DRYT <- fortify(M119_mcp.DRY, region = "id")
M119_mcp.MONT <- fortify(M119_mcp.MON, region = "id")
M119_mcp.PMT <- fortify(M119_mcp.PM, region = "id")

F114_mcp.EMT <- fortify(F114_mcp.EM, region = "id")
F114_mcp.DRYT <- fortify(F114_mcp.DRY, region = "id")
F114_mcp.MONT <- fortify(F114_mcp.MON, region = "id")
F114_mcp.PMT <- fortify(F114_mcp.PM, region = "id")

F137_mcp.EMT <- fortify(F137_mcp.EM, region = "id")
F137_mcp.DRYT <- fortify(F137_mcp.DRY, region = "id")
F137_mcp.MONT <- fortify(F137_mcp.MON, region = "id")
F137_mcp.PMT <- fortify(F137_mcp.PM, region = "id")

F147_mcp.EMT <- fortify(F147_mcp.EM, region = "id")
F147_mcp.DRYT <- fortify(F147_mcp.DRY, region = "id")
F147_mcp.MONT <- fortify(F147_mcp.MON, region = "id")
F147_mcp.PMT <- fortify(F147_mcp.PM, region = "id")

F252_mcp.EMT <- fortify(F252_mcp.EM, region = "id")
F252_mcp.DRYT <- fortify(F252_mcp.DRY, region = "id")
F252_mcp.MONT <- fortify(F252_mcp.MON, region = "id")
F252_mcp.PMT <- fortify(F252_mcp.PM, region = "id")

F36_mcp.EMT <- fortify(F36_mcp.EM, region = "id")
F36_mcp.DRYT <- fortify(F36_mcp.DRY, region = "id")
F36_mcp.MONT <- fortify(F36_mcp.MON, region = "id")
F36_mcp.PMT <- fortify(F36_mcp.PM, region = "id")

F66_mcp.EMT <- fortify(F66_mcp.EM, region = "id")
F66_mcp.DRYT <- fortify(F66_mcp.DRY, region = "id")
F66_mcp.MONT <- fortify(F66_mcp.MON, region = "id")
F66_mcp.PMT <- fortify(F66_mcp.PM, region = "id")

mcp.shift.TEST5 <- ggplot() +
  geom_polygon(data=F114_mcp.EMT, aes(x=F114_mcp.EMT$long, y=F114_mcp.EMT$lat),
               alpha=0.1,colour="blue",linetype=2) +
  geom_polygon(data=F114_mcp.DRYT, aes(x=F114_mcp.DRYT$long, y=F114_mcp.DRYT$lat),
               alpha=0.1,colour="red",linetype=3) +
  geom_polygon(data=F114_mcp.MONT, aes(x=F114_mcp.MONT$long, y=F114_mcp.MONT$lat),
               alpha=0.1,colour="green",linetype=4) +
  geom_polygon(data=F114_mcp.PMT, aes(x=F114_mcp.PMT$long, y=F114_mcp.PMT$lat),
               alpha=0.1,colour="black",linetype=5) +
  geom_polygon(data=F137_mcp.EMT, aes(x=F137_mcp.EMT$long, y=F137_mcp.EMT$lat),
               alpha=0.1,colour="blue",linetype=2) +
  geom_polygon(data=F137_mcp.DRYT, aes(x=F137_mcp.DRYT$long, y=F137_mcp.DRYT$lat),
               alpha=0.1,colour="red",linetype=3) +
  geom_polygon(data=F137_mcp.MONT, aes(x=F137_mcp.MONT$long, y=F137_mcp.MONT$lat),
               alpha=0.1,colour="green",linetype=4) +
  geom_polygon(data=F137_mcp.PMT, aes(x=F137_mcp.PMT$long, y=F137_mcp.PMT$lat),
               alpha=0.1,colour="black",linetype=5) +
  geom_polygon(data=F147_mcp.EMT, aes(x=F147_mcp.EMT$long, y=F147_mcp.EMT$lat),
               alpha=0.1,colour="blue",linetype=2) +
  geom_polygon(data=F147_mcp.DRYT, aes(x=F147_mcp.DRYT$long, y=F147_mcp.DRYT$lat),
               alpha=0.1,colour="red",linetype=3) +
  geom_polygon(data=F147_mcp.MONT, aes(x=F147_mcp.MONT$long, y=F147_mcp.MONT$lat),
               alpha=0.1,colour="green",linetype=4) +
  geom_polygon(data=F147_mcp.PMT, aes(x=F147_mcp.PMT$long, y=F147_mcp.PMT$lat),
               alpha=0.1,colour="black",linetype=5) +
  # geom_polygon(data=F252_mcp.EMT, aes(x=F252_mcp.EMT$long, y=F252_mcp.EMT$lat),
  #              alpha=0.1,colour="black",linetype=2) +
  # geom_polygon(data=F252_mcp.DRYT, aes(x=F252_mcp.DRYT$long, y=F252_mcp.DRYT$lat),
  #              alpha=0.1,colour="black",linetype=3) +
  # geom_polygon(data=F252_mcp.MONT, aes(x=F252_mcp.MONT$long, y=F252_mcp.MONT$lat),
  #              alpha=0.1,colour="black",linetype=4) +
  # geom_polygon(data=F252_mcp.PMT, aes(x=F252_mcp.PMT$long, y=F252_mcp.PMT$lat),
  #              alpha=0.1,colour="black",linetype=5) +
  geom_polygon(data=F36_mcp.EMT, aes(x=F36_mcp.EMT$long, y=F36_mcp.EMT$lat),
               alpha=0.1,colour="blue",linetype=2) +
  geom_polygon(data=F36_mcp.DRYT, aes(x=F36_mcp.DRYT$long, y=F36_mcp.DRYT$lat),
               alpha=0.1,colour="red",linetype=3) +
  geom_polygon(data=F36_mcp.MONT, aes(x=F36_mcp.MONT$long, y=F36_mcp.MONT$lat),
               alpha=0.1,colour="green",linetype=4) +
  geom_polygon(data=F36_mcp.PMT, aes(x=F36_mcp.PMT$long, y=F36_mcp.PMT$lat),
               alpha=0.1,colour="black",linetype=5) +
  geom_polygon(data=F66_mcp.EMT, aes(x=F66_mcp.EMT$long, y=F66_mcp.EMT$lat),
               alpha=0.1,colour="blue",linetype=2) +
  geom_polygon(data=F66_mcp.DRYT, aes(x=F66_mcp.DRYT$long, y=F66_mcp.DRYT$lat),
               alpha=0.1,colour="red",linetype=3) +
  geom_polygon(data=F66_mcp.MONT, aes(x=F66_mcp.MONT$long, y=F66_mcp.MONT$lat),
               alpha=0.1,colour="green",linetype=4) +
  geom_polygon(data=F66_mcp.PMT, aes(x=F66_mcp.PMT$long, y=F66_mcp.PMT$lat),
               alpha=0.1,colour="black",linetype=5) +
  theme_bw() +
  labs(x="Easting (m)", y="Northing (m)") +
  labs(caption = "Figure 6 |  SC seasonal home range shifts of five lizards. All seasonal polygons stay relatively stable with \n considerable overlap and without any major shifts.")+
  theme(plot.caption = element_text(hjust = 0,lineheight = 0.9))+
  theme(legend.position="none", plot.title = element_text(face = "bold", hjust = 0.5))

mcp.shift.TEST5

TABLE group means of seasonal home ranges between the two populations averaged across sex

seasonal<-read.csv("SC_Seasonal_Data.csv")

library(Rmisc)

SEAS_GRP_Means <- summarySE(seasonal, measurevar="Home_Range_100mcp",
                            groupvars=c("Environment","Season"), na.rm = TRUE)

# SEAS_GRP_Means
kable(SEAS_GRP_Means, format = "pandoc", caption = 'Table 6 | Group means of seasonal home ranges between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized). These means are averaged across sex.')

RM-ANOVA for seasonal home ranges between environments

library(lme4)
library(readr)
library(lmerTest)
# seasonal<-read.csv("SC_Seasonal_Data.csv")

RM.mod.Season <- lmer(Home_Range_100mcp~Environment+Season+Sex+N+Environment*Season+(1|Gila), 
                      data=seasonal)
summary(RM.mod.Season)

ANOVA table of seasonal HRs between envs.

anova(RM.mod.Season)

TABLE of seasonal home ranges by sex between the two populations

SEAS_GRP_TEST <- summarySE(seasonal, measurevar="Home_Range_100mcp",
                           groupvars=c("Environment","Season","Sex"), na.rm = TRUE)
# SEAS_GRP_Means
kable(SEAS_GRP_TEST, format = "pandoc", caption = 'Table 7 | Seasonal home range means between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized) popuations for males and females. These are raw means before being adjusted for environment, season, sex, and sample size.')
Table 7 | Seasonal home range means between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized) popuations for males and females. These are raw means before being adjusted for environment, season, sex, and sample size.
Environment Season Sex N Home_Range_100mcp sd se ci
nonsubsidized Dry female 5 15.6600000 8.6291946 3.8590932 10.7145603
nonsubsidized Dry male 7 29.4714286 12.6476235 4.7803524 11.6971008
nonsubsidized Emergence female 5 4.4600000 3.4333657 1.5354478 4.2630866
nonsubsidized Emergence male 5 1.1600000 1.8242807 0.8158431 2.2651436
nonsubsidized Monsoon female 6 22.9833333 9.8151753 4.0070285 10.3003948
nonsubsidized Monsoon male 7 24.2285714 9.8668999 3.7293376 9.1253605
nonsubsidized Post_Monsoon female 4 1.4000000 1.4491377 0.7245688 2.3059014
nonsubsidized Post_Monsoon male 7 0.2857143 0.3670993 0.1387505 0.3395102
subsidized Dry female 11 10.1754545 8.0883118 2.4387178 5.4338018
subsidized Dry male 6 18.2816667 13.2661214 5.4158714 13.9219406
subsidized Emergence female 6 2.1133333 1.8474920 0.7542354 1.9388239
subsidized Emergence male 3 2.0666667 1.5326556 0.8848792 3.8073277
subsidized Monsoon female 11 10.6918182 8.4988679 2.5625051 5.7096172
subsidized Monsoon male 7 10.3528571 6.3010018 2.3815548 5.8274547
subsidized Post_Monsoon female 11 3.6309091 5.5527983 1.6742317 3.7304207
subsidized Post_Monsoon male 3 0.6333333 0.8007705 0.4623250 1.9892241

figures for raw seasonal home ranges between the two populations

Figures Adjusted EMMs of seasonal home range between the two populations

Collective grid of raw and adjusted seasonal home ranges

ggarrange(raw.seasonal, adj.seasonal, labels = c("A", "B"),
          nrow = 2)

Post hoc analyses of seasonal home ranges

Pairwise of each season between populations, overaged over levels of sex

emm_s.t <- emmeans(RM.mod.Season, pairwise ~ Environment | Season)
emm_s.t
$emmeans
Season = Dry:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  18.66 2.13 85.1   14.428    22.89
 subsidized     13.21 1.68 84.3    9.866    16.56

Season = Emergence:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   3.36 2.11 85.3   -0.844     7.56
 subsidized      3.99 2.44 83.5   -0.864     8.84

Season = Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  21.77 1.92 83.7   17.943    25.59
 subsidized      8.60 1.69 82.8    5.239    11.96

Season = Post_Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   3.21 2.26 83.7   -1.290     7.72
 subsidized      3.99 2.08 84.1   -0.152     8.13

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized    5.448 2.67 85.0  2.037  0.0448 

Season = Emergence:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -0.630 3.16 85.1 -0.199  0.8426 

Season = Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   13.167 2.52 83.5  5.219  <.0001 

Season = Post_Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -0.776 2.99 86.4 -0.259  0.7960 

Results are averaged over the levels of: Sex 

Graphical comparisons

plot(emm_s.t, comparisons = TRUE)

Pairwise between seasons within each popultion

emm_s.t4
$emmeans
Environment = nonsubsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           18.86 2.25 88.4   14.383    23.34
 Emergence      3.33 2.24 88.7   -1.118     7.77
 Monsoon       21.85 2.03 87.5   17.811    25.89
 Post_Monsoon   2.36 2.36 87.0   -2.322     7.04

Environment = subsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           12.23 1.75 87.4    8.745    15.72
 Emergence      4.32 2.55 84.7   -0.741     9.39
 Monsoon        9.04 1.78 86.0    5.515    12.57
 Post_Monsoon   5.09 2.07 85.8    0.981     9.21

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Environment = nonsubsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence            15.532 3.07 69.4  5.054  <.0001 
 Dry - Monsoon              -2.992 2.89 67.3 -1.036  0.7292 
 Dry - Post_Monsoon         16.500 3.24 78.9  5.098  <.0001 
 Emergence - Monsoon       -18.524 2.91 68.0 -6.361  <.0001 
 Emergence - Post_Monsoon    0.968 3.08 73.0  0.314  0.9891 
 Monsoon - Post_Monsoon     19.492 3.03 74.0  6.426  <.0001 

Environment = subsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence             7.907 3.11 88.6  2.543  0.0602 
 Dry - Monsoon               3.187 2.28 66.0  1.395  0.5070 
 Dry - Post_Monsoon          7.137 2.68 80.2  2.666  0.0450 
 Emergence - Monsoon        -4.720 3.20 89.6 -1.475  0.4569 
 Emergence - Post_Monsoon   -0.769 2.94 77.2 -0.262  0.9937 
 Monsoon - Post_Monsoon      3.951 2.78 84.9  1.421  0.4899 

Results are averaged over the levels of: Sex 
P value adjustment: tukey method for comparing a family of 4 estimates 

Graphical Comps

plot(emm_s.t4, comparisons = TRUE)

Pairwise between sexes of each season of the subsidized population

sub <- subset(seasonal, Environment == "subsidized")

RM.mod.Sub <- lmer(Home_Range_100mcp~Season+Sex+N+Season*Sex+(1|Gila), data=sub)

emm_s.t5 <- emmeans(RM.mod.Sub, pairwise ~ Sex | Season)
emm_s.t5 

Graphical Comps

plot(emm_s.t5, comparisons = TRUE)

Pairwise between sexes of each season of the non-subsidized population

nonsub <- subset(seasonal, Environment == "nonsubsidized")
View(nonsub)
RM.mod.NSub <- lmer(Home_Range_100mcp~Season+Sex+N+Season*Sex+(1|Gila), data=nonsub)

emm_s.t6 <- emmeans(RM.mod.NSub, pairwise ~ Sex | Season)
emm_s.t6 

Graphical Comps

plot(emm_s.t6, comparisons = TRUE)
LS0tCnRpdGxlOiAiU3BhdGlhbCBTY3JpcHRzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKCmBgYHtyfQpwYWNrcmF0Ojppbml0KCJ+L0Rlc2t0b3AvSGVsb2Rlcm1hIFNwYXRpYWwvSGVsb2Rlcm1hIFNwYXRpYWwiKQpgYGAKCgoKYGBge3J9CiMgcmVxdWlyZWQgcGFja2FnZXMKbGlicmFyeShhZGVoYWJpdGF0SFIpICNmb3IgaG9tZSByYW5nZSBjYWxjdWxhdGlvbnMKbGlicmFyeShkYXRhLnRhYmxlKSAjbWFuaXB1bGF0ZSBTMyBhbmQgUzQgZGF0YSB0YWJsZXMKbGlicmFyeShnZ3Bsb3QyKSAjZm9yIGdyYXBoaWMgb3V0cHV0CmxpYnJhcnkoZ2dmb3J0aWZ5KSAjdG8gYWxsb3cgZ2dwbG90MiB0byByZWFkIHNwYXRpYWwgZGF0YQpsaWJyYXJ5KGdyaWQpICN0byBhZGQgYW5ub3RhdGlvbnMgdG8gdGhlIG91dHB1dAojIGxpYnJhcnkoT3BlblN0cmVldE1hcCkgI2ZvciBvYnRhaW5pbmcgcmFzdGVyIGltYWdlcwpsaWJyYXJ5KHBiYXBwbHkpICNuZWVkZWQgZm9yIHByb2dyZXNzIGJhcgpsaWJyYXJ5KHBsb3RseSkgI2ZvciBpbnRlcmFjdGl2ZSB4eSBwbG90CmxpYnJhcnkocmdkYWwpICNmb3IgY29udmVydGluZyBzcGF0aWFsIGRhdGEKbGlicmFyeShzcCkgI2ZvciBjb252ZXJ0aW5nIHNwYXRpYWwgZGF0YQpsaWJyYXJ5KHJnZW9zKQojIGxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KG1hcHZpZXcpCgpgYGAKCgoKCgpPdmVyYWxsIGluZGl2aWR1YWwgeWVhcmx5IGhvbWUgcmFuZ2VzIGZvciBub24vc3Vic2lkaXplZCBwb3B1bGF0aW9ucwpgYGB7ciBlY2hvPUZBTFNFfQpHTV90YWJsZSA8LSByZWFkX2NzdigiR01fdGFibGUuY3N2IikKa2FibGUoR01fdGFibGUsZm9ybWF0PSJwYW5kb2MiLCBjYXB0aW9uPSdUYWJsZSAxIHwgUG9vbGVkIG92ZXJhbGwgaG9tZSByYW5nZXMgb2YgR2lsYSBNb25zdGVycyBhdCBPd2wgSGVhZCBCdXR0ZXMgYW5kIFN0b25lIENhbnlvbiBHb2xmIENsdWIuIEJvdGggMTAwJSBhbmQgOTUlIE1DUHMgd2VyZSBjYWxjdWxhdGVkIGJldHdlZW4gYm90aCBwb3B1bGF0aW9ucy4nKQpgYGAKCgoKCgpHaWxhIG1vbnN0ZXIgbG9jYXRpb25zIGZvciBhbGwgdHJhY2tlZCBsaXphcmRzIGFjcm9zcyBTdG9uZSBDYW55b24KYGBge3J9CkFsbC5HaWxhcyA8LSByZWFkX2NzdigiLi9HTV9GaW5hbF9EYXRhLmNzdiIpCgp1dG1fcG9pbnRzIDwtIGNiaW5kKEFsbC5HaWxhcyRFQVNUSU5HLCBBbGwuR2lsYXMkTk9SVEhJTkcpCgp1dG1fbG9jYXRpb25zIDwtIFNwYXRpYWxQb2ludHModXRtX3BvaW50cywgcHJvajRzdHJpbmc9Q1JTLlNDKQoKcHJval9sYXQubG9uIDwtIGFzLmRhdGEuZnJhbWUoc3BUcmFuc2Zvcm0odXRtX2xvY2F0aW9ucywgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKSkKY29sbmFtZXMocHJval9sYXQubG9uKSA8LSBjKCJ4IiwieSIpCgojIyBGT1JUSUdZIFNQQVRJQUwgU1BBVElBTCBQT0lOVFMgRk9SIFBMT1RUSU5HOgpwcm9qX2xhdC5sb24gPC0gZm9ydGlmeShwcm9qX2xhdC5sb24sIHJlZ2lvbiA9ICJUeXBlIikKCm15TWFwIDwtIGdldF9zdGFtZW5tYXAoYmJveCA9IGMobGVmdCA9IC0xMTEuMDA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IDMyLjQ1OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IC0xMTAuOTY5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IDMyLjQ3NCksCiAgICAgICAgICAgICAgICAgICAgICAgbWFwdHlwZSA9ICJ0ZXJyYWluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgY3JvcCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSAxNSkKCmdnbWFwKG15TWFwKStnZW9tX3BvaW50KGRhdGE9cHJval9sYXQubG9uLCBhZXMoeD14LCB5PXkpLCBzaXplPTAuMykKYGBgCgoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBPVkVSQUxMIFlFQVJMWSBBTkFMWVNFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIwoKClBsb3Qgb2YgMTAwJSAgTUNQIEhScyBhZ2FpbnN0IG51bWJlciBvZiByZWxvY2F0aW9ucwpgYGB7cn0KeWVhciA8LSByZWFkX2NzdigiR01fQ29uc29saWRhdGVkX0J5WWVhci5jc3YiKQoKIyBxdWljayBwbG90CiMgR3JhcGgxPC1nZ3Bsb3QoeWVhcixhZXMoeD1OMTAwLHk9SG9tZV9SYW5nZV8xMDBtY3AsZ3JvdXA9RW52aXJvbm1lbnQpKSsKR3JhcGgxPC1nZ3Bsb3QoeWVhcixhZXMoeD1OMTAwLHk9SG9tZV9SYW5nZV8xMDBtY3ApKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDE2LCAyKSkrCiAgZ2VvbV9zbW9vdGgoYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSxjb2xvdXI9ImJsYWNrIiwgbWV0aG9kPSJsbSIpICsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoc3Vic2lkaXplZD0iY3lhbjMiLG5vbnN1YnNpZGl6ZWQ9ImluZGlhbiByZWQxIikpKwogICMgbGFicyh0aXRsZSA9ICIxMDAlIE1DUCBIb21lIFJhbmdlcyIpKwogIHhsYWIoIk51bWJlciBvZiBSZWxvY2F0aW9ucyIpKwogIHlsYWIoIjEwMCUgTUNQIEFyZWEgKGhhKSIpKwogIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZV9idygpCgpHcmFwaDE8LUdyYXBoMSt0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKIyBsZWdlbmQgYXQgdG9wLWxlZnQsIGluc2lkZSB0aGUgcGxvdApTQ09ILmhyLmZpZzwtR3JhcGgxICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAogICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKSArCiAgICAgICAgICAgICAgIHNjYWxlX3NoYXBlX2Rpc2NyZXRlKG5hbWUgID0iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9Yygibm9uc3Vic2lkaXplZCIsICJzdWJzaWRpemVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5vbnN1YnNpZGl6ZWQiLCAiU3Vic2lkaXplZCIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShuYW1lICA9IiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoIm5vbnN1YnNpZGl6ZWQiLCAic3Vic2lkaXplZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJOb25zdWJzaWRpemVkIiwgIlN1YnNpZGl6ZWQiKSkKClNDT0guaHIuZmlnCiMgZGlyLmNyZWF0ZSgib3V0cHV0cyIpICMgY3JlYXRlIGEgbmV3IGZvbGRlciB0byBob2xkIHRoZSBvdXRwdXQgZmlsZXMKIyBnZ3NhdmUoIm91dHB1dHMvU0NfT0hCX3Bsb3QucGRmIikKYGBgCgoKClBsb3Qgb2YgOTUlIEtERXMgYWdhaW5zdCByZWxvY2F0aW9ucwpgYGB7cn0KeWVhcjIgPC0gcmVhZF9jc3YoIkdNX0NvbnNvbGlkYXRlZF9CeVllYXJfSW5wdXQuY3N2IikKCiMgcXVpY2sgcGxvdAojIEdyYXBoMTwtZ2dwbG90KHllYXIsYWVzKHg9TjEwMCx5PUhvbWVfUmFuZ2VfMTAwbWNwLGdyb3VwPUVudmlyb25tZW50KSkrCkdyYXBoMjwtZ2dwbG90KHllYXIsYWVzKHg9Tix5PUhvbWVfUmFuZ2VfOTVrZGUpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDE2LCAyKSkrCiAgZ2VvbV9zbW9vdGgoYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSxjb2xvdXI9ImJsYWNrIiwgbWV0aG9kPSJsbSIpICsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoc3Vic2lkaXplZD0iY3lhbjMiLG5vbnN1YnNpZGl6ZWQ9ImluZGlhbiByZWQxIikpKwogICMgbGFicyh0aXRsZSA9ICIxMDAlIE1DUCBIb21lIFJhbmdlcyIpKwogIHhsYWIoIk51bWJlciBvZiBSZWxvY2F0aW9ucyIpKwogIHlsYWIoIjk1JSBLREUgQXJlYSAoaGEpIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz0gYygwLDEyNSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDAsMTI1KSkgKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZV9idygpCgpHcmFwaDI8LUdyYXBoMit0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKIyBsZWdlbmQgYXQgdG9wLWxlZnQsIGluc2lkZSB0aGUgcGxvdApTQ09ILmhyLmZpZzI8LUdyYXBoMiArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAogICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkgKwogICAgICAgICAgICAgICBzY2FsZV9zaGFwZV9kaXNjcmV0ZShuYW1lICA9IiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoIm5vbnN1YnNpZGl6ZWQiLCAic3Vic2lkaXplZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJOb25zdWJzaWRpemVkIiwgIlN1YnNpZGl6ZWQiKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfbGluZXR5cGVfZGlzY3JldGUobmFtZSAgPSIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKCJub25zdWJzaWRpemVkIiwgInN1YnNpZGl6ZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTm9uc3Vic2lkaXplZCIsICJTdWJzaWRpemVkIikpCgpTQ09ILmhyLmZpZzIKIyBkaXIuY3JlYXRlKCJvdXRwdXRzIikgIyBjcmVhdGUgYSBuZXcgZm9sZGVyIHRvIGhvbGQgdGhlIG91dHB1dCBmaWxlcwojIGdnc2F2ZSgib3V0cHV0cy9TQ19PSEJfcGxvdC5wZGYiKQpgYGAKCgoKCk92ZXJhbGwgY29tYmluZWQgMTAwJSBNQ1AgbWVhbnMgYXZlcmFnZWQgYWNyb3NzIHNleApgYGB7cn0KbGlicmFyeShSbWlzYykKTWVhbnMgPC0gc3VtbWFyeVNFKHllYXIsIG1lYXN1cmV2YXI9IkhvbWVfUmFuZ2VfMTAwbWNwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiKSxuYS5ybSA9IFRSVUUpCgprYWJsZShNZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnT3ZlcmFsbCBjb21iaW5lZCAxMDAlIE1DUCBtZWFucyBhdmVyYWdlZCBhY3Jvc3Mgc2V4JykKYGBgCgoKCgoKT3ZlcmFsbCBjb21iaW5lZCA5NSUgTUNQIG1lYW5zIGF2ZXJhZ2VkIGFjcm9zcyBzZXgKYGBge3J9Ck1lYW5zLjk1bWNwIDwtIHN1bW1hcnlTRSh5ZWFyLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzk1bWNwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiKSxuYS5ybSA9IFRSVUUpCk1lYW5zLjk1bWNwCmBgYAoKCgoKClNldCBwcm9qZWN0aW9uIGZvciBtYXBwaW5nCmBgYHtyfQpDUlMuU0M8LUNSUygiK3Byb2o9dXRtICt6b25lPTEyICtlbGxwcz1XR1M4NCArdW5pdHM9bSArbm9fZGVmcyIpCmBgYAoKCgoKCkZ1bmN0aW9uIGZvciBNQ1AgYW5hbHlzaXMKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbWNwX2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGZpbGVuYW1lLCBwZXJjZW50YWdlKXsKICBkYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSkKICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQogIHkgPC0gYXMuZGF0YS5mcmFtZShkYXRhJE5PUlRISU5HKQogIHh5IDwtIGMoeCx5KQogIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQogIHh5IDwtIFNwYXRpYWxQb2ludHMoZGF0YS5wcm9qQGNvb3JkcykKICBtY3Aub3V0IDwtIG1jcCh4eSwgcGVyY2VudGFnZSwgdW5vdXQ9ImhhIikKICBhcmVhIDwtIGFzLmRhdGEuZnJhbWUocm91bmQobWNwLm91dEBkYXRhJGFyZWEsNCkpCiAgLnJvd05hbWVzREYoYXJlYSwgbWFrZS5uYW1lcz1UUlVFKSA8LSBkYXRhJFlFQVIKICB3cml0ZS50YWJsZShhcmVhLGZpbGU9Ik1DUF9IZWN0YXJlcy5jc3YiLAogICAgICAgICAgICAgIGFwcGVuZD1UUlVFLHNlcD0iLCIsIGNvbC5uYW1lcz1GQUxTRSwgcm93Lm5hbWVzPVRSVUUpCiAgbWNwLnBvaW50cyA8LSBjYmluZCgoZGF0YS5mcmFtZSh4eSkpLGRhdGEkWUVBUikKICBjb2xuYW1lcyhtY3AucG9pbnRzKSA8LSBjKCJ4IiwieSIsICJ5ZWFyIikKICBtY3AucG9seSA8LSBmb3J0aWZ5KG1jcC5vdXQsIHJlZ2lvbiA9ICJpZCIpCiAgdW5pdHMgPC0gZ3JpZC50ZXh0KHBhc3RlKHJvdW5kKG1jcC5vdXRAZGF0YSRhcmVhLDIpLCIgaGEiKSwgeD0wLjksICB5PTAuOTUsCiAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udGZhY2U9NCwgY2V4PTAuOSksIGRyYXcgPSBGQUxTRSkKICBtY3AucGxvdCA8LSBnZ3Bsb3QoKSArCiAgICBnZW9tX3BvbHlnb24oZGF0YT1tY3AucG9seSwgYWVzKHg9bWNwLnBvbHkkbG9uZywgeT1tY3AucG9seSRsYXQpLCBhbHBoYT0wLjUpICsKICAgIGdlb21fcG9pbnQoZGF0YT1tY3AucG9pbnRzLCBhZXMoeD14LCB5PXkpKSArIHRoZW1lX2J3KCkgKwogICAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIsIHRpdGxlPW1jcC5wb2ludHMkeWVhcikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpICsKICAgIGFubm90YXRpb25fY3VzdG9tKHVuaXRzKQogIG1jcC5wbG90Cn0KYGBgCgoKRnVuY3Rpb24gb2YgTUNQIHBvbHlnb25zIHVzZWQgZm9yIG1hcHBpbmcKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBDUlMuU0M8LUNSUygiK3Byb2o9dXRtICt6b25lPTEyICtlbGxwcz1XR1M4NCArdW5pdHM9bSArbm9fZGVmcyIpCgptY3BfYW5hbHlzaXMuUE9MWSA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIGRhdGEuc3AgPC0gZGF0YVssIGMoIkxJWkFSRE5VTUJFUiIsICJFQVNUSU5HIiwgIk5PUlRISU5HIildCiAgY29vcmRpbmF0ZXMoZGF0YS5zcCkgPC0gYygiRUFTVElORyIsICJOT1JUSElORyIpCiAgcHJvajRzdHJpbmcoZGF0YS5zcCkgPC0gQ1JTLlNDCiAgbWNwX291dCA8LSBtY3AoZGF0YS5zcCwgcGVyY2VudGFnZSwgdW5vdXQ9ImhhIikKfQpgYGAKCgpGdW5jdGlvbiBvZiBLREUgYW5hbHlzaXMKYGBge3J9CmtkZV9hbmFseXNpcy5ocmVmLnBsb3QgPC0gZnVuY3Rpb24oZmlsZW5hbWUsIHBlcmNlbnRhZ2UpewogIGRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGVuYW1lKQogIHggPC0gYXMuZGF0YS5mcmFtZShkYXRhJEVBU1RJTkcpCiAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiAgeHkgPC0gYyh4LHkpCiAgZGF0YS5wcm9qIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoeHksZGF0YSwgcHJvajRzdHJpbmcgPSBDUlMuU0MpCiAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQogIGtkZTwta2VybmVsVUQoeHksIGg9ImhyZWYiLCBrZXJuPSJiaXZub3JtIiwgZ3JpZD0xMDAwKQogIHZlciA8LSBnZXR2ZXJ0aWNlc2hyKGtkZSwgcGVyY2VudGFnZSkKICBhcmVhIDwtIGFzLmRhdGEuZnJhbWUocm91bmQodmVyJGFyZWEsNCkpCiAgLnJvd05hbWVzREYoYXJlYSwgbWFrZS5uYW1lcz1UUlVFKSA8LSBkYXRhJExJWkFSRE5VTUJFUgogIHdyaXRlLnRhYmxlKGFyZWEsZmlsZT0iS0RFX0hlY3RhcmVzLmNzdiIsCiAgICAgICAgICAgICAgYXBwZW5kPVRSVUUsc2VwPSIsIiwgY29sLm5hbWVzPUZBTFNFLCByb3cubmFtZXM9VFJVRSkKICBrZGUucG9pbnRzIDwtIGNiaW5kKChkYXRhLmZyYW1lKGRhdGEucHJvakBjb29yZHMpKSxkYXRhJExJWkFSRE5VTUJFUikKICBjb2xuYW1lcyhrZGUucG9pbnRzKSA8LSBjKCJ4IiwieSIsImxpemFyZG51bWJlciIpCiAga2RlLnBvbHkgPC0gZm9ydGlmeSh2ZXIsIHJlZ2lvbiA9ICJpZCIpCiAgdW5pdHMgPC0gZ3JpZC50ZXh0KHBhc3RlKHJvdW5kKHZlciRhcmVhLDIpLCIgaGEiKSwgeD0wLjksICB5PTAuOTUsCiAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udGZhY2U9NCwgY2V4PTAuOSksIGRyYXcgPSBGQUxTRSkKICBrZGUucGxvdCA8LSBnZ3Bsb3QoKSArCiAgICBnZW9tX3BvbHlnb24oZGF0YT1rZGUucG9seSwgYWVzKHg9a2RlLnBvbHkkbG9uZywgeT1rZGUucG9seSRsYXQpLCBhbHBoYSA9IDAuNSkgKwogICAgZ2VvbV9wb2ludChkYXRhPWtkZS5wb2ludHMsIGFlcyh4PXgsIHk9eSkpICsgdGhlbWVfYncoKSArCiAgICBsYWJzKHg9IkVhc3RpbmcgKG0pIiwgeT0iTm9ydGhpbmcgKG0pIiwgdGl0bGU9a2RlLnBvaW50cyRsaXphcmRudW1iZXIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKSArCiAgICBhbm5vdGF0aW9uX2N1c3RvbSh1bml0cykKICBrZGUucGxvdAp9CmBgYAoKCkZ1bmN0aW9uIG9mIEtERSBwb2x5Z29ucyBmb3IgbWFwcGluZwpgYGB7cn0Ka2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbiA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiAgeCA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkRUFTVElORykKICB5IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSROT1JUSElORykKICB4eSA8LSBjKHgseSkKICBkYXRhLnByb2ogPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSh4eSxkYXRhLCBwcm9qNHN0cmluZyA9IENSUy5TQykKICB4eSA8LSBTcGF0aWFsUG9pbnRzKGRhdGEucHJvakBjb29yZHMpCiAga2RlPC1rZXJuZWxVRCh4eSwgaD0iaHJlZiIsIGtlcm49ImJpdm5vcm0iLCBncmlkPTEwMDApCiAgdmVyIDwtIGdldHZlcnRpY2VzaHIoa2RlLCBwZXJjZW50YWdlKQogIHZlckBwcm9qNHN0cmluZzwtQ1JTLlNDCiAgYXJlYSA8LSBhcy5kYXRhLmZyYW1lKHJvdW5kKHZlciRhcmVhLDQpKQogIC5yb3dOYW1lc0RGKGFyZWEsIG1ha2UubmFtZXM9VFJVRSkgPC0gZGF0YSRZRUFSCiAgd3JpdGUudGFibGUoYXJlYSxmaWxlPSJLREVfSGVjdGFyZXMuY3N2IiwKICAgICAgICAgICAgICBhcHBlbmQ9VFJVRSxzZXA9IiwiLCBjb2wubmFtZXM9RkFMU0UsIHJvdy5uYW1lcz1UUlVFKQogIGtkZS5wb2ludHMgPC0gY2JpbmQoKGRhdGEuZnJhbWUoZGF0YS5wcm9qQGNvb3JkcykpLGRhdGEkWUVBUikKICBjb2xuYW1lcyhrZGUucG9pbnRzKSA8LSBjKCJ4IiwieSIsInllYXIiKQogIGtkZS5wb2x5IDwtIGZvcnRpZnkodmVyLCByZWdpb24gPSAiaWQiKQogIHVuaXRzIDwtIGdyaWQudGV4dChwYXN0ZShyb3VuZCh2ZXIkYXJlYSwyKSwiIGhhIiksIHg9MC45LCAgeT0wLjk1LAogICAgICAgICAgICAgICAgICAgICBncD1ncGFyKGZvbnRmYWNlPTQsIGNleD0wLjkpLCBkcmF3ID0gRkFMU0UpCiAgdmVyCn0KYGBgCgoKRnVuY3Rpb24gb2YgcmFzdGVyIG9mIFVEIApgYGB7cn0KIyBrZGVfYW5hbHlzaXMuaHJlZi5yYXN0ZXIgPC0gZnVuY3Rpb24oZmlsZW5hbWUpewojICAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiMgICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQojICAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiMgICB4eSA8LSBjKHgseSkKIyAgIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQojICAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQojICAga2RlPC1rZXJuZWxVRCh4eSwgaD0iaHJlZiIsIGtlcm49ImJpdm5vcm0iLCBncmlkPTEwMDApCiMgICBrZGU8LWFzKGtkZSwgIlNwYXRpYWxHcmlkRGF0YUZyYW1lIikKIyAgIGtkZUBwcm9qNHN0cmluZzwtIENSUy5TQwojICAga2RlCiMgfQpgYGAKCgpGdW5jdGlvbiBvZiB0cmFqZWN0b3J5IGFuYWx5c2lzIGFuZCBkaXN0YW5jZSBvdmVyIHRpbWUKYGBge3J9CnRyYWpfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZmlsZW5hbWUpewogIHJlbG9jc19kYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSkKICByZWxvY3MgPC0gYXMubHRyYWooY2JpbmQocmVsb2NzX2RhdGEkRUFTVElORywgcmVsb2NzX2RhdGEkTk9SVEhJTkcpLGlkPXJlbG9jc19kYXRhJExJWkFSRE5VTUJFUiwgdHlwZUlJID0gRkFMU0UsIGRhdGU9TlVMTCkKICByZWxvY3MuZGYgPC0gbGQocmVsb2NzKQogIHJlbG9jc19kaXN0IDwtIGFzLmRhdGEuZnJhbWUoc3VtKHNhcHBseShyZWxvY3MuZGYkZGlzdCwgc3VtLCBuYS5ybT1UUlVFKSkpCiAgY29sbmFtZXMocmVsb2NzX2Rpc3QpIDwtICJUb3RhbCBEaXN0YW5jZSIKICBuYW1lIDwtIHJlbG9jcy5kZiRpZFsxXQogIHJvdy5uYW1lcyhyZWxvY3NfZGlzdCkgPC0gbmFtZQogIHJlbG9jc191bml0cyA8LSBncmlkLnRleHQocGFzdGUocm91bmQocmVsb2NzX2Rpc3QsMiksIm0iKSwgeD0wLjksIHk9MC45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3A9Z3Bhcihmb250ZmFjZT0zLCBjb2w9ImJsYWNrIiwgY2V4PTAuOSksIGRyYXcgPSBGQUxTRSkKICByZWxvYy5wbG90IDwtIGdncGxvdCgpICsgdGhlbWVfY2xhc3NpYygpICsgZ2VvbV9wYXRoKGRhdGE9cmVsb2NzLmRmLCBhZXMoeD14LHk9eSksIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyhsZW5ndGg9dW5pdCguNSwiY20iKSwgYW5nbGUgPSAyMCwgZW5kcz0ibGFzdCIsIHR5cGUgPSAiY2xvc2VkIikpICsKICAgIGdlb21fcG9pbnQoZGF0YT1yZWxvY3MuZGYsIGFlcyh4PXgsIHk9eSkpICsgZ2VvbV9wb2ludChkYXRhPXJlbG9jcy5kZiwgYWVzKHg9eFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9eVsxXSksIHNpemUgPSAzLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBwY2g9MCkgKwogICAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIsIHRpdGxlPXJlbG9jcy5kZiRpZFsxXSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpICsKICAgIGFubm90YXRpb25fY3VzdG9tKHJlbG9jc191bml0cykKICByZWxvYy5wbG90Cn0KYGBgCgoKRnVuY3Rpb24gb2YgZGlzdGFuY2Ugb2YgdGltZQpgYGB7cn0KZGlzdF9hbmFseXNpcyA8LSBmdW5jdGlvbihmaWxlbmFtZSl7CiAgcmVsb2NzX2RhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGVuYW1lKQogIHJlbG9jcyA8LSBhcy5sdHJhaihjYmluZChyZWxvY3NfZGF0YSRFQVNUSU5HLCByZWxvY3NfZGF0YSROT1JUSElORyksaWQ9cmVsb2NzX2RhdGEkTElaQVJETlVNQkVSLCB0eXBlSUkgPSBGQUxTRSwgZGF0ZT1OVUxMKQogIHJlbG9jcy5kZiA8LSBsZChyZWxvY3MpCiAgcmVsb2NzX2Rpc3QgPC0gYXMuZGF0YS5mcmFtZShzdW0oc2FwcGx5KHJlbG9jcy5kZiRkaXN0LCBzdW0sIG5hLnJtPVRSVUUpKSkKICBjb2xuYW1lcyhyZWxvY3NfZGlzdCkgPC0gIlRvdGFsIERpc3RhbmNlIgogIG5hbWUgPC0gcmVsb2NzLmRmJGlkWzFdCiAgcm93Lm5hbWVzKHJlbG9jc19kaXN0KSA8LSBuYW1lCiAgd3JpdGUudGFibGUocmVsb2NzX2Rpc3QsZmlsZT0icmVsb2NfZGlzdC5jc3YiLAogICAgICAgICAgICAgIGFwcGVuZD1UUlVFLHNlcD0iLCIsIGNvbC5uYW1lcz1GQUxTRSwgcm93Lm5hbWVzPVRSVUUpCiAgZGlzdC5wbG90Cn0KYGBgCgoKTWFwIG9mIHllYXJseSBIUiBzaGlmdHMgb2YgYSBzdWJzZXQgb2YgR2lsYSBNb25zdGVycy4gSW5jbHVkZXMgcnVubmluZyBNQ1AgcG9seWdvbnMsIEZvcnRpZnkgbWNwIHBvbHlnb25zIGZvciBnZ3Bsb3QyIGJ5IFlFQVIKYGBge3J9Ck0yMTVfbWNwLjExPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9tY3AuMTI8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvMjAxMiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTA0X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEwNC8yMDA4IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMDRfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTA0LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMTE8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAxMSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDEyIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjEyPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuMDc8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvMjAwNyAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTEyX21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyLzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCiMjIEZvcnRpZnkgbWNwIHBvbHlnb25zIGZvciBnZ3Bsb3QyICpZRUFSKjoKCkYxMDRfbWNwLjA4VCA8LSBmb3J0aWZ5KEYxMDRfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpGMTA0X21jcC4wOVQgPC0gZm9ydGlmeShGMTA0X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMDhUIDwtIGZvcnRpZnkoRjExNF9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4xMFQgPC0gZm9ydGlmeShGMTE0X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMTFUIDwtIGZvcnRpZnkoRjExNF9tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjEyVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjEyLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC4wOVQgPC0gZm9ydGlmeShGMTM3X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuMTBUIDwtIGZvcnRpZnkoRjEzN19tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLjExVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLjExLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC4wOVQgPC0gZm9ydGlmeShGMTQ3X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuMTBUIDwtIGZvcnRpZnkoRjE0N19tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLjExVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLjExLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC4xMlQgPC0gZm9ydGlmeShGMTQ3X21jcC4xMiwgcmVnaW9uID0gImlkIikKRjM2X21jcC4wOFQgPC0gZm9ydGlmeShGMzZfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjA5VCA8LSBmb3J0aWZ5KEYzNl9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMTBUIDwtIGZvcnRpZnkoRjM2X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjM2X21jcC4xMVQgPC0gZm9ydGlmeShGMzZfbWNwLjExLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjEyVCA8LSBmb3J0aWZ5KEYzNl9tY3AuMTIsIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuMDhUIDwtIGZvcnRpZnkoRjY2X21jcC4wOCwgcmVnaW9uID0gImlkIikKRjY2X21jcC4wOVQgPC0gZm9ydGlmeShGNjZfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLjEwVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLjA4VCA8LSBmb3J0aWZ5KE0xMTlfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC4wOVQgPC0gZm9ydGlmeShNMTE5X21jcC4wOSwgcmVnaW9uID0gImlkIikKTTExOV9tY3AuMTBUIDwtIGZvcnRpZnkoTTExOV9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk0xMTJfbWNwLjA3VCA8LSBmb3J0aWZ5KE0xMTJfbWNwLjA3LCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC4wOVQgPC0gZm9ydGlmeShNMTEyX21jcC4wOSwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuMTBUIDwtIGZvcnRpZnkoTTExMl9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk02OV9tY3AuMDlUIDwtIGZvcnRpZnkoTTY5X21jcC4wOSwgcmVnaW9uID0gImlkIikKTTY5X21jcC4xMFQgPC0gZm9ydGlmeShNNjlfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC4xMVQgPC0gZm9ydGlmeShNMjE1X21jcC4xMSwgcmVnaW9uID0gImlkIikKTTIxNV9tY3AuMTJUIDwtIGZvcnRpZnkoTTIxNV9tY3AuMTIsIHJlZ2lvbiA9ICJpZCIpCgoKbWNwLnNoaWZ0LlRFU1Q0IDwtIGdncGxvdCgpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYxMDRfbWNwLjA4VCwgYWVzKHg9RjEwNF9tY3AuMDhUJGxvbmcsIHk9RjEwNF9tY3AuMDhUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYxMDRfbWNwLjA5VCwgYWVzKHg9RjEwNF9tY3AuMDlUJGxvbmcsIHk9RjEwNF9tY3AuMDlUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4wOFQsIGFlcyh4PUYxMTRfbWNwLjA4VCRsb25nLCB5PUYxMTRfbWNwLjA4VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjA5VCwgYWVzKHg9RjExNF9tY3AuMDlUJGxvbmcsIHk9RjExNF9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuMTBULCBhZXMoeD1GMTE0X21jcC4xMFQkbG9uZywgeT1GMTE0X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4xMVQsIGFlcyh4PUYxMTRfbWNwLjExVCRsb25nLCB5PUYxMTRfbWNwLjExVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjEyVCwgYWVzKHg9RjExNF9tY3AuMTJUJGxvbmcsIHk9RjExNF9tY3AuMTJUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuMDlULCBhZXMoeD1GMTM3X21jcC4wOVQkbG9uZywgeT1GMTM3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYnJvd24iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC4xMFQsIGFlcyh4PUYxMzdfbWNwLjEwVCRsb25nLCB5PUYxMzdfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJicm93biIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLjExVCwgYWVzKHg9RjEzN19tY3AuMTFUJGxvbmcsIHk9RjEzN19tY3AuMTFUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJyb3duIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMDlULCBhZXMoeD1GMTQ3X21jcC4wOVQkbG9uZywgeT1GMTQ3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTBULCBhZXMoeD1GMTQ3X21jcC4xMFQkbG9uZywgeT1GMTQ3X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTFULCBhZXMoeD1GMTQ3X21jcC4xMVQkbG9uZywgeT1GMTQ3X21jcC4xMVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTJULCBhZXMoeD1GMTQ3X21jcC4xMlQkbG9uZywgeT1GMTQ3X21jcC4xMlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjA4VCwgYWVzKHg9RjM2X21jcC4wOFQkbG9uZywgeT1GMzZfbWNwLjA4VCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjA5VCwgYWVzKHg9RjM2X21jcC4wOVQkbG9uZywgeT1GMzZfbWNwLjA5VCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjEwVCwgYWVzKHg9RjM2X21jcC4xMFQkbG9uZywgeT1GMzZfbWNwLjEwVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjExVCwgYWVzKHg9RjM2X21jcC4xMVQkbG9uZywgeT1GMzZfbWNwLjExVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjEyVCwgYWVzKHg9RjM2X21jcC4xMlQkbG9uZywgeT1GMzZfbWNwLjEyVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC4wOFQsIGFlcyh4PUY2Nl9tY3AuMDhUJGxvbmcsIHk9RjY2X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLjA5VCwgYWVzKHg9RjY2X21jcC4wOVQkbG9uZywgeT1GNjZfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuMTBULCBhZXMoeD1GNjZfbWNwLjEwVCRsb25nLCB5PUY2Nl9tY3AuMTBUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExOV9tY3AuMDhULCBhZXMoeD1NMTE5X21jcC4wOFQkbG9uZywgeT1NMTE5X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTlfbWNwLjA5VCwgYWVzKHg9TTExOV9tY3AuMDlUJGxvbmcsIHk9TTExOV9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTYpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTE5X21jcC4xMFQsIGFlcyh4PU0xMTlfbWNwLjEwVCRsb25nLCB5PU0xMTlfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMDdULCBhZXMoeD1NMTEyX21jcC4wN1QkbG9uZywgeT1NMTEyX21jcC4wN1QkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icHVycGxlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMDlULCBhZXMoeD1NMTEyX21jcC4wOVQkbG9uZywgeT1NMTEyX21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icHVycGxlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMTBULCBhZXMoeD1NMTEyX21jcC4xMFQkbG9uZywgeT1NMTEyX21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icHVycGxlIixsaW5ldHlwZT0yKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NNjlfbWNwLjA5VCwgYWVzKHg9TTY5X21jcC4wOVQkbG9uZywgeT1NNjlfbWNwLjA5VCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9TTY5X21jcC4xMFQsIGFlcyh4PU02OV9tY3AuMTBUJGxvbmcsIHk9TTY5X21jcC4xMFQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPU0yMTVfbWNwLjExVCwgYWVzKHg9TTIxNV9tY3AuMTFUJGxvbmcsIHk9TTIxNV9tY3AuMTFUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NMjE1X21jcC4xMlQsIGFlcyh4PU0yMTVfbWNwLjEyVCRsb25nLCB5PU0yMTVfbWNwLjEyVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogIHRoZW1lX2J3KCkgK2xhYnMoeD0iRWFzdGluZyAobSkiLCB5PSJOb3J0aGluZyAobSkiKQogICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSA1ICB8ICBTQyBZZWFybHkgaG9tZSByYW5nZSBzaGlmdHMgb2YgOCBsaXphcmRzLCBib3RoIG1hbGVzIGFuZCBmZW1hbGVzLiBIb21lIHJhbmdlIHNoaWZ0cyBhcHBlYXIgdG8gYmUgXG4gcmVsYXRpdmxleSBzdGFibGUgb3ZlciBzdHVkeSB5ZWFycy4iKSsKICAjIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSkKIyMgd2l0aGluIGVhY2ggZ2VvbV9wb2x5Z29uIGxpbmU/OgojIyBhZXMoY29sb3VyPSJyZWQib3IiTTExMl9tY3AuMDlUIikuLi4rc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9IiIsYnJlYWtzPWMoIiIsIiIsLi4uIiIpKSsKIyMgdmFsdWVzPWMoIiI9IiIsLi4uKQoKbWNwLnNoaWZ0LlRFU1Q0CmBgYAoKCgoKClJhdyBncm91cCAxMDAlIE1DUCBob21lIHJhbmdlIG1lYW5zIG9mIFN0b25lIENhbnlvbiBhbmQgT3dsIEhlYWQgQnV0dGVzLiBHcm91cGVkIGJ5IGVudmlyb25tZW50IGFuZCBzZXgKYGBge3J9CmxpYnJhcnkoUm1pc2MpCllSX0dSUF9NZWFucyA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV8xMDBtY3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNleCIpLG5hLnJtID0gVFJVRSkKCmthYmxlKFlSX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIAogICAgICBjYXB0aW9uID0gJ1RhYmxlIDEgfCBSYXcgZ3JvdXAgMTAwJSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LicpCmBgYAoKCgoKUmF3IGdyb3VwIDk1JSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4CmBgYHtyfQpZUl9HUlBfTWVhbnM5NSA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV85NW1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiLCJTZXgiKSxuYS5ybSA9IFRSVUUpCgprYWJsZShZUl9HUlBfTWVhbnM5NSwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgMiB8IFJhdyBncm91cCA5NSUgTUNQIGhvbWUgcmFuZ2UgbWVhbnMgb2YgcmF3IGRhdGEgb2YgU3RvbmUgQ2FueW9uIGFuZCBPd2wgSGVhZCBCdXR0ZXMuIEdyb3VwZWQgYnkgZW52aXJvbm1lbnQgYW5kIHNleC4nKQpgYGAKCgoKClJNLUFOT1ZBIGZvciAxMDAlIE1DUCBhbmFseXNlcyBiZXR3ZWVuIHRoZSBzdWJzaWRpemVkIGFuZCBub24tc3Vic2lkaXplZApgYGB7cn0KIyBHZXQgcC12YWx1ZXMgZnJvbSBtaXhlZCBtb2RlbCBGIHZhbHVlczoKbGlicmFyeShsbWU0KQpsaWJyYXJ5KHJlYWRyKQp5ZWFyIDwtIHJlYWRfY3N2KCJHTV9Db25zb2xpZGF0ZWRfQnlZZWFyLmNzdiIpCgpSTW1vZC55ZWFyPC1sbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCnN1bW1hcnkoUk1tb2QueWVhcikKYGBgCgoKQU5PVkEgdGFibGUgZm9yIDEwMCUgTUNQcyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMKYGBge3J9CmFub3ZhKFJNbW9kLnllYXIpCmBgYAoKCgoKClJNLUFOT1ZBIGZvciA5NSUgTUNQIGFuYWx5c2VzIGJldHdlZW4gdGhlIHN1YnNpZGl6ZWQgYW5kIG5vbi1zdWJzaWRpemVkCmBgYHtyfQpSTW1vZC55ZWFyOTU8LWxtZXIoSG9tZV9SYW5nZV85NW1jcH5FbnZpcm9ubWVudCtZZWFyK1NleCtOOTUrRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCnN1bW1hcnkoUk1tb2QueWVhcjk1KQpgYGAKCgpBTk9WQSB0YWJsZSBmb3IgOTUlIE1DUHMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zCmBgYHtyfQphbm92YShSTW1vZC55ZWFyOTUpCmBgYAoKCgoKClJhdyBncm91cCBtZWFucyBBTkQgYWRqdXN0ZWQgRU1NcyBvZiBZZWFybHkgT3ZlcmFsbCAxMDAlTUNQCmBgYHtyfQpSTW1vZC55ZWFyMTAwPC1sbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KygxfEdpbGEpLGRhdGEgPSB5ZWFyKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU1NcyBhZGp1c3RlZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKUk0ubWFyZ2luYWwgPC0gbHNtZWFucyhSTW1vZC55ZWFyMTAwLCAKICAgICAgICAgICAgICAgICAgICB+IEVudmlyb25tZW50KQojIFJNLm1hcmdpbmFsIDwtIGxzbWVhbnMoUk1tb2QueWVhcjEwMCwgCiMgICAgICAgICAgICAgICAgICAgICB+IFNleCkKCiMjIENBVEFHT1JJWkUgTFNNIEdSQVBIIEJZIFNFWCBCRVRXRUVOIEVOVklST05NRU5UOgpyZWZSTV9zZXggPC0gbHNtZWFucyhSTW1vZC55ZWFyMTAwLCBzcGVjcyA9IGMoIkVudmlyb25tZW50IiwiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9zZXggPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX3NleCkpCnBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKCnlyLm1lYW4uYWRqPC1nZ3Bsb3QocmVmX2RmUk1fc2V4LCBhZXMoeD1TZXgseT1sc21lYW4sZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksIAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMSwgMikpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bHNtZWFuLVNFLCB5bWF4PWxzbWVhbitTRSksIHdpZHRoPS4xLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogIGdlb21fbGluZShwb3NpdGlvbj1wZF9STSxhZXMobGluZXR5cGU9RW52aXJvbm1lbnQpLCBzaG93LmxlZ2VuZD1GQUxTRSkgKwogIHRoZW1lX2J3KCkgICsKICB4bGFiKCIiKSArCiAgeWxhYigiIikgKwogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSAKCnlyLm1lYW4uYWRqCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSYXcgR3JvdXAgTWVhbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKClJhdy5ZZWFySFI8LWdncGxvdChZUl9HUlBfTWVhbnMsIGFlcyh4PVNleCx5PUhvbWVfUmFuZ2VfMTAwbWNwLGdyb3VwPUVudmlyb25tZW50KSkrCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBmYWN0b3IoRW52aXJvbm1lbnQpKSwgc2l6ZSA9IDQscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjEpKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUhvbWVfUmFuZ2VfMTAwbWNwLXNlLCB5bWF4PUhvbWVfUmFuZ2VfMTAwbWNwK3NlKSwKICAgICAgICAgICAgICAgIHdpZHRoPS4xLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogIGdlb21fbGluZShwb3NpdGlvbj1wZF9STSxhZXMobGluZXR5cGU9RW52aXJvbm1lbnQpLCBzaG93LmxlZ2VuZD1GQUxTRSkgKwogIHRoZW1lX2J3KCkrCiAgeGxhYigiIikrCiAgeWxhYigiMTAwJSBNQ1AgQXJlYSAoaGEpIikgKwogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSAKCgpSYXcuWWVhckhSPC1SYXcuWWVhckhSICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKSArCiAgIHNjYWxlX3NoYXBlX2Rpc2NyZXRlKG5hbWUgID0iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9Yygibm9uc3Vic2lkaXplZCIsICJzdWJzaWRpemVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5vbnN1YnNpZGl6ZWQiLCAiU3Vic2lkaXplZCIpKQoKUmF3LlllYXJIUgoKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGdyaWQpCgojIGdyaWQuYXJyYW5nZShSYXcuWWVhckhSLCB5ci5tZWFuLmFkaiwgbnJvdyA9IDEsICAKIyAgICAgICAgICAgICAgYm90dG9tID0gdGV4dEdyb2IoIkZpZ3VyZSA1IHwgYS4gUmF3IGdyb3VwIG1lYW5zIG9mIG92ZXJhbGwgeWVhcmx5IGhvbWUgcmFuZ2VzIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMuIE5vdGUgdGhhdCB0aGUgbWFsZSBcbiBob21lIHJhbmdlIG9mIHRoZSBzdWJzaWRpemVkIHBvcHVsYXRpb24gaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZlbWFsZSBob21lIHJhbmdlIGluIHRoZSBub24tc3Vic2lkaXplZCBcbiBwb3B1bGF0aW9uLiBiLiBHcm91cCBtZWFucyBvZiBob21lIHJhbmdlcyBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgZW52aXJvbm1lbnQsIHllYXIsIHNleCwgYW5kIHNhbXBsZSBzaXplLiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250ZmFjZSA9IDEsZm9udHNpemUgPSAxMCksaGp1c3QgPSAwLCB4ID0gMCkpCgojIGdyaWQuYXJyYW5nZShSYXcuWWVhckhSLCB5ci5tZWFuLmFkaiwgbnJvdyA9IDEpCiMgZ3JpZC5hcnJhbmdlKFJhdy5ZZWFySFIsIHlyLm1lYW4uYWRqLCBucm93ID0gMSkKIyBnZ2FycmFuZ2UoUmF3LlllYXJIUiwgeXIubWVhbi5hZGosIGxhYmVscyA9IGMoIkEiLCAiQiIpLAojICAgICAgICAgICBuY29sID0gMikKYGBgCgoKCgoKCkRpcmVjdGlvbmFsIG1lYW5zIG9mIGhvbWUgcmFuZ2UgKDEwMCUgTUNQKSBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgeWVhciwgc2V4IGFuZCBzYW1wbGUgc2l6ZQpgYGB7cn0Ka2FibGUocmVmX2RmUk1fc2V4LCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSB8IERpcmVjdGlvbmFsIG1lYW5zIG9mIGhvbWUgcmFuZ2UgKDEwMCUgTUNQKSBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgeWVhciwgc2V4IGFuZCBzYW1wbGUgc2l6ZS4nKQpgYGAKCgpgYGB7cn0KUk0uOTVLREVtb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzk1a2RlfkVudmlyb25tZW50K1llYXIrU2V4K04rRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCgpzdW1tYXJ5KFJNLjk1S0RFbW9kLnllYXIpCmBgYAoKYGBge3J9CmFub3ZhKFJNLjk1S0RFbW9kLnllYXIpCmBgYAoKClJNLUFOT1ZBIG9mIDk1JSBLREVzIGZvciB0aGUgc3Vic2lkaXplZCBwb3B1bGF0aW9uCmBgYHtyfQpSTS5LREVtb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzk1a2RlflllYXIrU2V4K04rKDF8R2lsYSksZGF0YSA9IHN1YikKCnN1bW1hcnkoUk0uS0RFbW9kLnllYXIpCmBgYAoKQU5PVkEgVGFibGUgZm9yIDk1JUtERQpgYGB7cn0KYW5vdmEoUk0uS0RFbW9kLnllYXIpCmBgYAoKCgoKUk0tQU5PVkEgb2YgNTAlIEtERXMgZm9yIHRoZSBzdWJzaWRpemVkCmBgYHtyfQpSTS5LREUuNTAubW9kLnllYXI8LWxtZXIoSG9tZV9SYW5nZV81MGtkZX5ZZWFyK1NleCtOKygxfEdpbGEpLGRhdGEgPSBzdWIpCgpzdW1tYXJ5KFJNLktERS41MC5tb2QueWVhcikKYGBgCgpBTk9WQSBUYWxiZSBvZiA1MCUgIEtERSBmb3IgdGhlIHN1YnNpZGl6ZWQKYGBge3J9CmFub3ZhKFJNLktERS41MC5tb2QueWVhcikKYGBgCgoKCgpUQUJMRS4gUmF3IEdyb3VwIDUwJSBLREUgaG9tZSByYW5nZSBtZWFucyBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uCmBgYHtyfQpZUl9HUlBfTWVhbnMuNTBLREUgPC0gc3VtbWFyeVNFKHN1YiwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV81MGtkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiU2V4IiksbmEucm0gPSBUUlVFKQoKa2FibGUoWVJfR1JQX01lYW5zLjUwS0RFLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSA1IHwgUmF3IEdyb3VwIDUwJSBLREUgaG9tZSByYW5nZSBtZWFucyBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uLicpCmBgYAoKCgoKUmF3IGdyb3VwIG1lYW5zIEFORCBhZGp1c3RlZCBFTU1zIG9mIFllYXJseSBPdmVyYWxsIDk1JSBLREVzIGJldHdlZW4gbm9uL3N1YnNpZGl6ZWQgcG9wdWxhdGlvbnMKYGBge3J9ClJNbW9kLjk1a2RlPC1sbWVyKEhvbWVfUmFuZ2VfOTVrZGV+RW52aXJvbm1lbnQrWWVhcitTZXgrTitFbnZpcm9ubWVudCpTZXgrKDF8R2lsYSksZGF0YSA9IHllYXIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVNTXMgb2YgOTUlIEtERXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpSTS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNbW9kLjk1a2RlLCAKICAgICAgICAgICAgICAgICAgICAgICB+IEVudmlyb25tZW50KQoKIyMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX2tkZSA8LSBsc21lYW5zKFJNbW9kLjk1a2RlLCBzcGVjcyA9IGMoIkVudmlyb25tZW50IiwiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9rZGUgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX2tkZSkpCiMgcGRfUk0gPC0gcG9zaXRpb25fZG9kZ2UoMC4xKQoKa2RlLm1lYW4uYWRqPC1nZ3Bsb3QocmVmX2RmUk1fa2RlLCBhZXMoeD1TZXgseT1sc21lYW4sZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksIAogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDEsIDIpKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICBnZW9tX2xpbmUocG9zaXRpb249cGRfUk0sYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSwgc2hvdy5sZWdlbmQ9RkFMU0UpICsKICB0aGVtZV9idygpKwogIHhsYWIoIiIpKwogIHlsYWIoIiIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg3LC44NSksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9MTYpLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGUueSAgPSBlbGVtZW50X3RleHQoc2l6ZT0xOCksCiAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJGZW1hbGUiLCAiTWFsZSIpKSAKCmtkZS5tZWFuLmFkajwta2RlLm1lYW4uYWRqICsgeWxpbSgwLDkwKQprZGUubWVhbi5hZGoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcmF3IEVNTXMgb2YgOTUlIEtERXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcG9zaXRpb249cGRfUk0sIGxpbmV0eXBlPWMoImRvdGRhc2giLCAic29saWQiKQojIHBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKCiMgZ2VvbV9saW5lKHBvc2l0aW9uPXBkKSsKClJhdy5rZGU8LWdncGxvdChZUl9NZWFucy45NUtERWFsbCwgYWVzKHg9U2V4LHk9SG9tZV9SYW5nZV85NWtkZSxncm91cD1FbnZpcm9ubWVudCkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzk1a2RlLXNlLCB5bWF4PUhvbWVfUmFuZ2VfOTVrZGUrc2UpLAogICAgICAgICAgICAgICAgd2lkdGg9LjEsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsKICBnZW9tX2xpbmUocG9zaXRpb249cGRfUk0sYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSwgc2hvdy5sZWdlbmQ9RkFMU0UpICsKICAjIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXM9YygiZG90ZGFzaCIsICJzb2xpZCIpKSsKICB0aGVtZV9idygpICsKICB4bGFiKCIiKSArCiAgeWxhYigiOTUlIEtERSBBcmVhIChoYSkiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODcsLjg1KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xNiksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkZlbWFsZSIsICJNYWxlIikpIAoKUmF3LmtkZTwtUmF3LmtkZSArIHlsaW0oMCw5MCkKUmF3LmtkZQoKIyBSYXcua2RlPC1SYXcua2RlICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKSArCiMgICBzY2FsZV9zaGFwZV9kaXNjcmV0ZShuYW1lICA9IiIsCiMgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9Yygibm9uc3Vic2lkaXplZCIsICJzdWJzaWRpemVkIiksCiMgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTm9uc3Vic2lkaXplZCIsICJTdWJzaWRpemVkIikpClJhdy5rZGU8LVJhdy5rZGUgKyB5bGltKDAsOTApClJhdy5rZGUKCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGdyaWQpCgojIGdnYXJyYW5nZShSYXcua2RlLCBrZGUubWVhbi5hZGosIGxhYmVscyA9IGMoIkEiLCAiQiIpLAojICAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCkNvbGxlY3RpdmUgZ3JpZCBvZiAxMDAlIE1DUCBhbmQgOTUlIEtERSBvZiBib3RoIHNpdGVzIGZyb20gYWJvdmUKYGBge3J9CmdnYXJyYW5nZShSYXcuWWVhckhSLCB5ci5tZWFuLmFkaiwgUmF3LmtkZSwga2RlLm1lYW4uYWRqLCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsIkQiKSwKICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMikKYGBgCgoKCgo0My40IG1hbGUgNDIuOSBmZW1hbGUKWWVhcmx5IG92ZXJhbGwgbWVhbnMgb2YgOTUlIEtERXMgZ3JvdXBlZCBieSBzaXRlIGFuZCBzZXgKYGBge3J9CllSX01lYW5zLjk1S0RFYWxsIDwtIHN1bW1hcnlTRSh5ZWFyLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzk1a2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNleCIpLG5hLnJtID0gVFJVRSkKIAprYWJsZShZUl9NZWFucy45NUtERWFsbCwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgfCBSYXcgR3JvdXAgOTUlIEtERSBob21lIHJhbmdlIG1lYW5zIG1hbGUgYW5kIGZlbWFsZSBob21lIHJhbmdlcyBhdCBub24vc3Vic2lkaXplZC4nKQpgYGAKCgoKCgpQYWlyd2lzZSBDb21wYXJpc29ucywgYmV0d2VlbiBzZXhlcyBieSBlbnZpcm9ubWVudCwgYW5kIGJldHdlZW4gZW52aXJvbm1lbnRzIGF2ZXJhZ2VkIGFjcm9zcyBzZXgKYGBge3J9ClJNbW9kLnllYXIuRW08LWxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrWWVhcitTZXgrTjEwMCtFbnZpcm9ubWVudCpTZXgrCiAgICAgICAgICAgICAgICAgICAgICAoMXxHaWxhKSxkYXRhID0geWVhcikKClJNbW9kLnllYXIuRW05NTwtbG1lcihIb21lX1JhbmdlXzk1bWNwfkVudmlyb25tZW50K1llYXIrU2V4K045NStFbnZpcm9ubWVudCpTZXgrCiAgICAgICAgICAgICAgICAgICAgICAoMXxHaWxhKSxkYXRhID0geWVhcikKCiMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX3NleCA8LSBsc21lYW5zKFJNbW9kLnllYXIuRW0sIHNwZWNzID0gYygiRW52aXJvbm1lbnQiLCJTZXgiKSkKCmVtbV9zLlRLIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNleCkKZW1tX3MuVEsKCmVtbV9zLnQyIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBTZXggfCBFbnZpcm9ubWVudCkKZW1tX3MudDIKZW1tX3MuZTEgPC0gZW1tZWFucyhSTW1vZC55ZWFyLkVtOTUsIHBhaXJ3aXNlIH4gRW52aXJvbm1lbnQgfCBTZXgpCmVtbV9zLmUxCmBgYAoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggV2l0aGluIEVhY2ggRW52aXJvbm1lbnQ6CmBgYHtyfQpwbG90KGVtbV9zLnQyLCBjb21wYXJpc29ucyA9IFRSVUUsIHhsYWIgPSAiTGVhc3QgU3F1YXJlIE1lYW4gKGhhKSIsIHlsYWIgPSAiRW52aXJvbm1lbnQiKQpgYGAKCgoKClBhaXJ3aXNlIGJ5IHNleCBiZXR3ZWVuIGVudmlvcm5lbWVudHMgMTAwJSAgTUNQLCBhbmQgOTUlIEtERXMKYGBge3J9ClJNbW9kLjk1a2RlPC1sbWVyKEhvbWVfUmFuZ2VfOTVrZGV+RW52aXJvbm1lbnQrWWVhcitTZXgrTitFbnZpcm9ubWVudCpTZXgrKDF8R2lsYSksZGF0YSA9IHllYXIpCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fa2RlIDwtIGxzbWVhbnMoUk1tb2QuOTVrZGUsIHNwZWNzID0gYygiRW52aXJvbm1lbnQiLCJTZXgiKSkKCmVtbV9zLnQzIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNleCkKZW1tX3MudDMKCmVtbV9zLnQ5NSA8LSBlbW1lYW5zKFJNbW9kLjk1a2RlLCBwYWlyd2lzZSB+IEVudmlyb25tZW50IHwgU2V4KQplbW1fcy50OTUKYGBgCgoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zOgpgYGB7cn0KcGxvdChlbW1fcy50MywgY29tcGFyaXNvbnMgPSBUUlVFLCB4bGFiID0gIkxlYXN0IFNxdWFyZSBNZWFuIChoYSkiLCB5bGFiID0gIkVudmlyb25tZW50IikKYGBgCgoKCgoKSW5lcmFjdGl2ZSBtYXAgb2YgTUNQcyBhdCBTdG9uZSBDYW55b24KYGBge3J9Ck02N19NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL002Ny9NNjcgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTY5L002OSAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMjU1X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTI1NS9NMjU1IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0yMTVfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMjE1L00yMTUgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTE0X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTE0L00xNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMTE5X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTExOS9NMTE5IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMTEyL00xMTIgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKCkY2Nl9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0Y2Ni9GNjYgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjM2L0YzNiAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMjUyX01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjI1Mi9GMjUyIC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYyMTRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMjE0L0YyMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjIwMF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YyMDAvRjIwMCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjE0Ny9GMTQ3IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxNDZfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTQ2L0YxNDYgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMzcvRjEzNyAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTM1X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjEzNS9GMTM1IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTE0L0YxMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjEwNF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMDQvRjEwNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQoKTWFsZS5NQ1AgPC0gcmJpbmQoTTY3X01DUCxNNjlfTUNQLE0yNTVfTUNQLE0yMTVfTUNQLE0xNF9NQ1AsTTExOV9NQ1AsTTExMl9NQ1ApCkZlbWFsZS5NQ1AgPC0gcmJpbmQoRjY2X01DUCxGMzZfTUNQLEYyNTJfTUNQLEYyMTRfTUNQLEYyMDBfTUNQLEYxNDdfTUNQLEYxNDZfTUNQLEYxMzdfTUNQLAogICAgICAgICAgICAgICAgICAgIEYxMzVfTUNQLEYxMTRfTUNQLEYxMDRfTUNQKQoKbWFwdmlld09wdGlvbnMoYmFzZW1hcHMgPSBjKCJPcGVuU3RyZWV0TWFwIiwiRXNyaS5Xb3JsZEltYWdlcnkiLCJPcGVuVG9wb01hcCIpLAogICAgICAgICAgICAgICBuYS5jb2xvciA9ICJtYWdlbnRhIiwKICAgICAgICAgICAgICAgbGF5ZXJzLmNvbnRyb2wucG9zID0gInRvcGxlZnQiKQoKbWFwdmlldyhNYWxlLk1DUCwgbGVnZW5kPUYsIHpjb2w9ImlkIiwgY29sLnJlZ2lvbnMgPSBjKCJibHVlIiksIGFscGhhLnJlZ2lvbnM9MC4zKSArIAogIG1hcHZpZXcoRmVtYWxlLk1DUCwgbGVnZW5kPUYsIHpjb2wgPSAiaWQiLCBjb2wucmVnaW9ucyA9IGMoInJlZCIpLCBhbHBoYS5yZWdpb25zPTAuMykKYGBgCgoKCgoKQ3JlYXRlIHN0YWduYW50IHN0YW1lbiBtYXAgb2YgTUNQcyBhdCBTdG9uZSBDYW55b24KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMjIEdldC92aWV3IHRoZSBzdGFtZW4gbWFwIChiYm94IHNob3VsZCBiZSBhZGp1c3RlZCBhcHByb3ByaWF0ZWx5KToKbXlNYXAgPC0gZ2V0X3N0YW1lbm1hcChiYm94ID0gYyhsZWZ0ID0gLTExMS4wMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gMzIuNDU5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gLTExMC45NjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gMzIuNDc0KSwKICAgICAgICAgICAgICAgICAgICAgICBtYXB0eXBlID0gInRlcnJhaW4iLCAKICAgICAgICAgICAgICAgICAgICAgICBjcm9wID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IDE1KQoKRjEwNF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjEwNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjExNF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjExNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjEzNV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjEzNV9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjEzN19sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjEzN19NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjE0Nl9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjE0Nl9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjE0N19sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjE0N19NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjIwMF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjIwMF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjIxNF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjIxNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjI1Ml9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjI1Ml9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjM2X2xhdGxvbiA8LSBzcFRyYW5zZm9ybShGMzZfTUNQLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkY2Nl9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjY2X01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTEyX2xhdGxvbiA8LSBzcFRyYW5zZm9ybShNMTEyX01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTE5X2xhdGxvbiA8LSBzcFRyYW5zZm9ybShNMTE5X01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTRfbGF0bG9uIDwtIHNwVHJhbnNmb3JtKE0xNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTIxNV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oTTIxNV9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTI1NV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oTTI1NV9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTY3X2xhdGxvbiA8LSBzcFRyYW5zZm9ybShNNjdfTUNQLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk02OV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oTTY5X01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQoKU0Nfc3RhbWVuX21hcCA8LSBnZ21hcChteU1hcCkgKwogICMgZ2VvbV9wb2ludChkYXRhID0gcHJval9sYXQubG9uLCBhZXMoeD14LCB5PXkpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMDRfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzVfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM3X2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjE0Nl9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxNDdfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMjAwX2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjIxNF9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYyNTJfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMzZfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGNjZfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTExOV9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE0xNF9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMjE1X2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTI1NV9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE02N19sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNNjlfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICB4bGFiKCJMb25naXR1ZGUiKSArCiAgeWxhYigiTGF0aXR1ZGUiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgojIFNDX3N0YW1lbl9tYXAKCmxpYnJhcnkoZ2dzbikKClNDX3N0YW1lbl9tYXA8LVNDX3N0YW1lbl9tYXAgKyBnZ3NuOjpzY2FsZWJhcih4Lm1pbiA9IC0xMTAuOTcyLCB4Lm1heCA9IC0xMTAuOTY2LAogICAgICAgICAgICAgICAgICAgICB5Lm1pbiA9IDMyLjQ3NCwgeS5tYXggPSAzMi40NzYsIAogICAgICAgICAgICAgICAgICAgICBkaXN0ID0gNTAwLCBkaXN0X3VuaXQ9Im0iLCAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTAuMTksCiAgICAgICAgICAgICAgICAgICAgIHN0LmJvdHRvbT1UUlVFLCAKICAgICAgICAgICAgICAgICAgICAgc3QuZGlzdD0wLjMsCiAgICAgICAgICAgICAgICAgICAgIHN0LnNpemU9My41LAogICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSAnV0dTODQnKSAKIyBTQ19zdGFtZW5fbWFwClNDX3N0YW1lbl9tYXArbm9ydGgyKFNDX3N0YW1lbl9tYXAsIHggPSAwLjg5LCB5ID0gMC44NSwgc2NhbGUgPSAwLjEsIHN5bWJvbCA9IDE2KQpgYGAKCgoKYGBge3J9Cm15TWFwIDwtIGdldF9zdGFtZW5tYXAoYmJveCA9IGMobGVmdCA9IC0xMTEuMDA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IDMyLjQ1OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IC0xMTAuOTY5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IDMyLjQ3NCksCiAgICAgICAgICAgICAgICAgICAgICAgbWFwdHlwZSA9ICJ0ZXJyYWluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgY3JvcCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSAxNSkKCkYxMDRfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShGMTA0X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpGMTE0X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjExNF9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjEzNV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYxMzVfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkYxMzdfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShGMTM3X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpGMTQ2X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjE0Nl9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjE0N19sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYxNDdfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkYyMDBfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShGMjAwX0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpGMjE0X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjIxNF9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjI1Ml9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYyNTJfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkYzNl9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYzNl9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjY2X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjY2X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTEyX2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oTTExMl9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTExOV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE0xMTlfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk0xNF9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE0xNF9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTIxNV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE0yMTVfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk0yNTVfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShNMjU1X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNNjdfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShNNjdfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk02OV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE02OV9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKClNDX3N0YW1lbl9tYXBLIDwtIGdnbWFwKG15TWFwKSArCiAgIyBnZW9tX3BvaW50KGRhdGEgPSBwcm9qX2xhdC5sb24sIGFlcyh4PXgsIHk9eSksIHNpemUgPSAwLjMsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjEwNF9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM1X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjEzN19sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxNDZfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjIwMF9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYyMTRfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMjUyX2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjM2X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEY2Nl9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTE5X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTRfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTIxNV9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTI1NV9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTY3X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE02OV9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIHhsYWIoIkxvbmdpdHVkZSIpICsKICB5bGFiKCJMYXRpdHVkZSIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCiMgU0Nfc3RhbWVuX21hcEsKClNDX3N0YW1lbl9tYXBLIDwtIFNDX3N0YW1lbl9tYXBLICsgZ2dzbjo6c2NhbGViYXIoeC5taW4gPSAtMTEwLjk3MiwgeC5tYXggPSAtMTEwLjk2NiwKICAgICAgICAgICAgICAgICAgICAgeS5taW4gPSAzMi40NzYsIHkubWF4ID0gMzIuNDc4LCAKICAgICAgICAgICAgICAgICAgICAgZGlzdCA9IDUwMCwgZGlzdF91bml0PSJtIiwgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodD0wLjE5LAogICAgICAgICAgICAgICAgICAgICBzdC5ib3R0b209VFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIHN0LmRpc3Q9MC4zLAogICAgICAgICAgICAgICAgICAgICBzdC5zaXplPTMuNSwKICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gJ1dHUzg0JykgCiMgU0Nfc3RhbWVuX21hcEsKClNDX3N0YW1lbl9tYXBLICsgbm9ydGgyKFNDX3N0YW1lbl9tYXBLLCB4ID0gMC44OSwgeSA9IDAuODQsIHNjYWxlID0gMC4xLCBzeW1ib2wgPSAxNikKYGBgCgoKCmBgYHtyfQpTZWFzb24uTWFwIDwtIGdldF9zdGFtZW5tYXAoYmJveCA9IGMobGVmdCA9IC0xMTEuMDA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IDMyLjQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gLTExMC45OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSAzMi40NzUpLAogICAgICAgICAgICAgICAgICAgICAgIG1hcHR5cGUgPSAidG9uZXItYmFja2dyb3VuZCIsIAogICAgICAgICAgICAgICAgICAgICAgIGNyb3AgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gMTYpCgpTQ19zdGFtZW5fbWFwUyA8LSBnZ21hcChTZWFzb24uTWFwKSArCiAgIyBnZW9tX3BvaW50KGRhdGEgPSBwcm9qX2xhdC5sb24sIGFlcyh4PXgsIHk9eSksIHNpemUgPSAwLjMsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb25FKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmxhY2siLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MiwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uRCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0yLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb25NKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0yLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb25QKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiZ3JlZW4iLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MiwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uRSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM3X2xhdGxvbkQpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uTSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uUCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImdyZWVuIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbkUpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibGFjayIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0zLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjE0N19sYXRsb25EKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTMsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbk0pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTMsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvblApLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJncmVlbiIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0zLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjM2X2xhdGxvbkUpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibGFjayIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT00LCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjM2X2xhdGxvbkQpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9NCwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYzNl9sYXRsb25NKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTQsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMzZfbGF0bG9uUCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImdyZWVuIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTQsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGNjZfbGF0bG9uRSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTUsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGNjZfbGF0bG9uRCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT01LCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbk0pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgbGluZXR5cGU9NSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEY2Nl9sYXRsb25QKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiZ3JlZW4iLAogICAgICAgICAgICAgICBsaW5ldHlwZT01LCBmaWxsID0gTkEpICsKICB4bGFiKCJMb25naXR1ZGUiKSArCiAgeWxhYigiTGF0aXR1ZGUiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgpTQ19zdGFtZW5fbWFwUyA8LSBTQ19zdGFtZW5fbWFwUyArIGdnc246OnNjYWxlYmFyKHgubWluID0gLTExMS4wMDUsIHgubWF4ID0gLTExMC45OTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5taW4gPSAzMi40NjEsIHkubWF4ID0gMzIuNDYzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID0gMjUwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X3VuaXQ9Im0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9MC4xOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5ib3R0b209RkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LmRpc3Q9MC4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnNpemU9MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICdXR1M4NCcpIAojIFNDX3N0YW1lbl9tYXBTCgpTQ19zdGFtZW5fbWFwUyArIG5vcnRoMihTQ19zdGFtZW5fbWFwUywgeCA9IDAuMzYsIHkgPSAwLjMwLCBzY2FsZSA9IDAuMSwgc3ltYm9sID0gMTYpCmBgYAoKCgpgYGB7cn0KTUNQLlNoaWZ0LlllYXJseSA8LSBnZ21hcChTZWFzb24uTWFwKSArCiAgIyBnZW9tX3BvaW50KGRhdGEgPSBwcm9qX2xhdC5sb24sIGFlcyh4PXgsIHk9eSksIHNpemUgPSAwLjMsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb24uMDgpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTE0X2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb24uMTEpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uLjEyKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgIyAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjEzN19sYXRsb24uMTApLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAjICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICAjIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM3X2xhdGxvbi4xMSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICMgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbi4wOSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjE0N19sYXRsb24uMTApLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxNDdfbGF0bG9uLjExKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbi4xMiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbi4wOCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbi4wOSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTExOV9sYXRsb24uMDgpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE0xMTlfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTE5X2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICAjIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbi4wNyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICMgICAgICAgICAgICAgIGxpbmV0eXBlPTYsIGZpbGwgPSBOQSkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE0xMTJfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAjICAgICAgICAgICAgICBsaW5ldHlwZT02LCBmaWxsID0gTkEpICsKICAjIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgIyAgICAgICAgICAgICAgbGluZXR5cGU9NiwgZmlsbCA9IE5BKSArCiAgeGxhYigiTG9uZ2l0dWRlIikgKwogIHlsYWIoIkxhdGl0dWRlIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKTUNQLlNoaWZ0LlllYXJseSA8LSBNQ1AuU2hpZnQuWWVhcmx5ICsgZ2dzbjo6c2NhbGViYXIoeC5taW4gPSAtMTExLjAwNSwgeC5tYXggPSAtMTEwLjk5OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Lm1pbiA9IDMyLjQ2MSwgeS5tYXggPSAzMi40NjMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAyNTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfdW5pdD0ibSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD0wLjE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LmJvdHRvbT1GQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QuZGlzdD0wLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Quc2l6ZT0zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gJ1dHUzg0JykgCiMgTUNQLlNoaWZ0LlllYXJseQoKTUNQLlNoaWZ0LlllYXJseSArIG5vcnRoMihNQ1AuU2hpZnQuWWVhcmx5LCB4ID0gMC4zNiwgeSA9IDAuMzAsIHNjYWxlID0gMC4xLCBzeW1ib2wgPSAxNikKYGBgCgoKCkludGVyYWN0aXZlIG1hcCBvZiBLREVzIGF0IFN0b25lIENhbnlvbgpgYGB7cn0KTTY3X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjcvTTY3IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTY5X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjkvTTY5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTI1NV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTI1NS9NMjU1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTIxNV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTIxNS9NMjE1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTE0X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMTQvTTE0IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExOV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExOS9NMTE5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExMl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExMi9NMTEyIC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKCkY2Nl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjY2L0Y2NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYzNl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjM2L0YzNiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyNTJfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyNTIvRjI1MiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMTQvRjIxNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMDBfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMDAvRjIwMCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDcvRjE0NyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDZfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDYvRjE0NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzcvRjEzNyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzVfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzUvRjEzNSAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMTQvRjExNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMDRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMDQvRjEwNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCgpNYWxlLktERSA8LSByYmluZChNNjdfS0RFLE02OV9LREUsTTI1NV9LREUsTTIxNV9LREUsTTE0X0tERSxNMTE5X0tERSxNMTEyX0tERSkKRmVtYWxlLktERSA8LSByYmluZChGNjZfS0RFLEYzNl9LREUsRjI1Ml9LREUsRjIxNF9LREUsRjIwMF9LREUsRjE0N19LREUsRjE0Nl9LREUsRjEzN19LREUsCiAgICAgICAgICAgICAgICAgICAgRjEzNV9LREUsRjExNF9LREUsRjEwNF9LREUpCgptYXB2aWV3T3B0aW9ucyhiYXNlbWFwcyA9IGMoIk9wZW5TdHJlZXRNYXAiLCJFc3JpLldvcmxkSW1hZ2VyeSIsIk9wZW5Ub3BvTWFwIiksCiAgICAgICAgICAgICAgIG5hLmNvbG9yID0gIm1hZ2VudGEiLAogICAgICAgICAgICAgICBsYXllcnMuY29udHJvbC5wb3MgPSAidG9wbGVmdCIpCgptYXB2aWV3KE1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbD0iaWQiLCBjb2wucmVnaW9ucyA9IGMoImJsdWUiKSwgYWxwaGEucmVnaW9ucz0wLjMpICsgCiAgbWFwdmlldyhGZW1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbCA9ICJpZCIsIGNvbC5yZWdpb25zID0gYygicmVkIiksIGFscGhhLnJlZ2lvbnM9MC4zKQpgYGAKCgoKClRBQkxFIApgYGB7cn0Ka2FibGUocmVmX2RmUk1fa2RlLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSAgfCBTdWJzaWRpemVkIGFuZCBub24tc3Vic2lkaXplZCBkaXJlY3Rpb25hbCBtZWFucyBvZiBLREUgaG9tZSByYW5nZXMgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgZm9yIHllYXIsIHNleCBhbmQgc2FtcGxlIHNpemUuJykKYGBgCgoKCgojIyMjIyMjIyMjIyMjIyMgU0VBU09OQUwgQU5BTFlTRVMgIyMjIyMjIyMjIyMjIyMjIyMjCgoKTWFwIG9mIHNlYXNvbmFsIGZsdWN0aW9ucyBvZiBob21lIHJhbmdlcwpgYGB7cn0KIyMgQ3JlYXRlIE1DUCBwb2x5Z29ucyBieSBTRUFTT046Ck0yMTVfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMjE1X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0yMTVfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTIxNS9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpNMTEyX21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyL1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKTTExOV9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYxMTRfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjEzN19tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMTQ3X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYyNTJfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMjUyL0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMjUyX21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YyNTIvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYyNTJfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjI1Mi9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYyNTJfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMjUyL1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjM2X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjY2X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKIyMgRm9ydGlmeSBtY3AgcG9seWdvbnMgZm9yIGdncGxvdDIgKlNFQVNPTio6Ck0yMTVfbWNwLkVNVCA8LSBmb3J0aWZ5KE0yMTVfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC5EUllUIDwtIGZvcnRpZnkoTTIxNV9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC5NT05UIDwtIGZvcnRpZnkoTTIxNV9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQoKTTExMl9tY3AuRFJZVCA8LSBmb3J0aWZ5KE0xMTJfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuTU9OVCA8LSBmb3J0aWZ5KE0xMTJfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuUE1UIDwtIGZvcnRpZnkoTTExMl9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpNMTE5X21jcC5EUllUIDwtIGZvcnRpZnkoTTExOV9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC5NT05UIDwtIGZvcnRpZnkoTTExOV9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC5QTVQgPC0gZm9ydGlmeShNMTE5X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYxMTRfbWNwLkVNVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC5EUllUIDwtIGZvcnRpZnkoRjExNF9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC5NT05UIDwtIGZvcnRpZnkoRjExNF9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC5QTVQgPC0gZm9ydGlmeShGMTE0X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYxMzdfbWNwLkVNVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC5EUllUIDwtIGZvcnRpZnkoRjEzN19tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC5NT05UIDwtIGZvcnRpZnkoRjEzN19tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC5QTVQgPC0gZm9ydGlmeShGMTM3X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYxNDdfbWNwLkVNVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC5EUllUIDwtIGZvcnRpZnkoRjE0N19tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC5NT05UIDwtIGZvcnRpZnkoRjE0N19tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC5QTVQgPC0gZm9ydGlmeShGMTQ3X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYyNTJfbWNwLkVNVCA8LSBmb3J0aWZ5KEYyNTJfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMjUyX21jcC5EUllUIDwtIGZvcnRpZnkoRjI1Ml9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMjUyX21jcC5NT05UIDwtIGZvcnRpZnkoRjI1Ml9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMjUyX21jcC5QTVQgPC0gZm9ydGlmeShGMjUyX21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYzNl9tY3AuRU1UIDwtIGZvcnRpZnkoRjM2X21jcC5FTSwgcmVnaW9uID0gImlkIikKRjM2X21jcC5EUllUIDwtIGZvcnRpZnkoRjM2X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuTU9OVCA8LSBmb3J0aWZ5KEYzNl9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLlBNVCA8LSBmb3J0aWZ5KEYzNl9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpGNjZfbWNwLkVNVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuRFJZVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLk1PTlQgPC0gZm9ydGlmeShGNjZfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKRjY2X21jcC5QTVQgPC0gZm9ydGlmeShGNjZfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKbWNwLnNoaWZ0LlRFU1Q1IDwtIGdncGxvdCgpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5FTVQsIGFlcyh4PUYxMTRfbWNwLkVNVCRsb25nLCB5PUYxMTRfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuRFJZVCwgYWVzKHg9RjExNF9tY3AuRFJZVCRsb25nLCB5PUYxMTRfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuTU9OVCwgYWVzKHg9RjExNF9tY3AuTU9OVCRsb25nLCB5PUYxMTRfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5QTVQsIGFlcyh4PUYxMTRfbWNwLlBNVCRsb25nLCB5PUYxMTRfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLkVNVCwgYWVzKHg9RjEzN19tY3AuRU1UJGxvbmcsIHk9RjEzN19tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC5EUllULCBhZXMoeD1GMTM3X21jcC5EUllUJGxvbmcsIHk9RjEzN19tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC5NT05ULCBhZXMoeD1GMTM3X21jcC5NT05UJGxvbmcsIHk9RjEzN19tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLlBNVCwgYWVzKHg9RjEzN19tY3AuUE1UJGxvbmcsIHk9RjEzN19tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuRU1ULCBhZXMoeD1GMTQ3X21jcC5FTVQkbG9uZywgeT1GMTQ3X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUYxNDdfbWNwLkRSWVQsIGFlcyh4PUYxNDdfbWNwLkRSWVQkbG9uZywgeT1GMTQ3X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxNDdfbWNwLk1PTlQsIGFlcyh4PUYxNDdfbWNwLk1PTlQkbG9uZywgeT1GMTQ3X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuUE1ULCBhZXMoeD1GMTQ3X21jcC5QTVQkbG9uZywgeT1GMTQ3X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLkVNVCwgYWVzKHg9RjI1Ml9tY3AuRU1UJGxvbmcsIHk9RjI1Ml9tY3AuRU1UJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLkRSWVQsIGFlcyh4PUYyNTJfbWNwLkRSWVQkbG9uZywgeT1GMjUyX21jcC5EUllUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLk1PTlQsIGFlcyh4PUYyNTJfbWNwLk1PTlQkbG9uZywgeT1GMjUyX21jcC5NT05UJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTQpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLlBNVCwgYWVzKHg9RjI1Ml9tY3AuUE1UJGxvbmcsIHk9RjI1Ml9tY3AuUE1UJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLkVNVCwgYWVzKHg9RjM2X21jcC5FTVQkbG9uZywgeT1GMzZfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC5EUllULCBhZXMoeD1GMzZfbWNwLkRSWVQkbG9uZywgeT1GMzZfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC5NT05ULCBhZXMoeD1GMzZfbWNwLk1PTlQkbG9uZywgeT1GMzZfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLlBNVCwgYWVzKHg9RjM2X21jcC5QTVQkbG9uZywgeT1GMzZfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuRU1ULCBhZXMoeD1GNjZfbWNwLkVNVCRsb25nLCB5PUY2Nl9tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLkRSWVQsIGFlcyh4PUY2Nl9tY3AuRFJZVCRsb25nLCB5PUY2Nl9tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLk1PTlQsIGFlcyh4PUY2Nl9tY3AuTU9OVCRsb25nLCB5PUY2Nl9tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuUE1ULCBhZXMoeD1GNjZfbWNwLlBNVCRsb25nLCB5PUY2Nl9tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIpICsKICBsYWJzKGNhcHRpb24gPSAiRmlndXJlIDYgfCAgU0Mgc2Vhc29uYWwgaG9tZSByYW5nZSBzaGlmdHMgb2YgZml2ZSBsaXphcmRzLiBBbGwgc2Vhc29uYWwgcG9seWdvbnMgc3RheSByZWxhdGl2ZWx5IHN0YWJsZSB3aXRoIFxuIGNvbnNpZGVyYWJsZSBvdmVybGFwIGFuZCB3aXRob3V0IGFueSBtYWpvciBzaGlmdHMuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpCgptY3Auc2hpZnQuVEVTVDUKYGBgCgoKCgpUQUJMRSBncm91cCBtZWFucyAgb2Ygc2Vhc29uYWwgaG9tZSByYW5nZXMgYmV0d2VlbiB0aGUgIHR3byAgcG9wdWxhdGlvbnMgYXZlcmFnZWQgYWNyb3NzIHNleApgYGB7cn0Kc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpsaWJyYXJ5KFJtaXNjKQoKU0VBU19HUlBfTWVhbnMgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiLCJTZWFzb24iKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShTRUFTX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgNiB8IEdyb3VwIG1lYW5zIG9mIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIGJldHdlZW4gU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKSBhbmQgT3dsIEhlYWQgQnV0dGVzIChub24tc3Vic2lkaXplZCkuIFRoZXNlIG1lYW5zIGFyZSBhdmVyYWdlZCBhY3Jvc3Mgc2V4LicpCmBgYAoKCgoKUk0tQU5PVkEgZm9yIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIGJldHdlZW4gZW52aXJvbm1lbnRzCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkobG1lclRlc3QpCiMgc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpSTS5tb2QuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrU2Vhc29uK1NleCtOK0Vudmlyb25tZW50KlNlYXNvbisoMXxHaWxhKSwgCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbmFsKQpzdW1tYXJ5KFJNLm1vZC5TZWFzb24pCmBgYAoKCkFOT1ZBIHRhYmxlIG9mIHNlYXNvbmFsIEhScyBiZXR3ZWVuIGVudnMuCmBgYHtyfQphbm92YShSTS5tb2QuU2Vhc29uKQpgYGAKCgoKClRBQkxFIG9mIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIGJ5IHNleCBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMKYGBge3J9ClNFQVNfR1JQX1RFU1QgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfR1JQX1RFU1QsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1RhYmxlIDcgfCBTZWFzb25hbCBob21lIHJhbmdlIG1lYW5zIGJldHdlZW4gU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKSBhbmQgT3dsIEhlYWQgQnV0dGVzIChub24tc3Vic2lkaXplZCkgcG9wdWF0aW9ucyBmb3IgbWFsZXMgYW5kIGZlbWFsZXMuIFRoZXNlIGFyZSByYXcgbWVhbnMgYmVmb3JlIGJlaW5nIGFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgc2Vhc29uLCBzZXgsIGFuZCBzYW1wbGUgc2l6ZS4nKQpgYGAKCgoKCmZpZ3VyZXMgZm9yIHJhdyBzZWFzb25hbCBob21lIHJhbmdlcyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMKYGBge3J9CnBkIDwtIHBvc2l0aW9uX2RvZGdlKDAuMykgIyBtb3ZlIHRoZW0gLjA1IHRvIHRoZSBsZWZ0IGFuZCByaWdodCAoJ2RvZGdlcycpCgojIHJlbGV2ZWwgZmFjdG9yIHNlYXNvbjoKU0VBU19HUlBfVEVTVCRTZWFzb248LXJlbGV2ZWwoU0VBU19HUlBfVEVTVCRTZWFzb24sIkVtZXJnZW5jZSIpCgojIE5ldyBmYWNldCBsYWJlbCBuYW1lcyBmb3Igc2Vhc29ucwojIHNlYXNvbi5sYWJzIDwtIGMoIkRyeSIsICJFbWVyZ2VuY2UiLCAiTW9uc29vbiIsICJQb3N0IE1vbnNvb24iKQojIG5hbWVzKHNlYXNvbi5sYWJzKSA8LSBjKCJEcnkiLCAiRW1lcmdlbmNlIiwgIk1vbnNvb24iLCAiUG9zdF9Nb25zb29uIikKCnNlYXNvbi5sYWJzIDwtIGMoIkVtZXJnZW5jZSIsICJEcnkiLCAiTW9uc29vbiIsICJQb3N0IE1vbnNvb24iKQpuYW1lcyhzZWFzb24ubGFicykgPC0gYygiRW1lcmdlbmNlIiwgIkRyeSIsICJNb25zb29uIiwgIlBvc3RfTW9uc29vbiIpCgojIyBURVNUIDMKcmF3LnNlYXNvbmFsPC1nZ3Bsb3QoU0VBU19HUlBfVEVTVCxhZXMoeD1FbnZpcm9ubWVudCwgeT1Ib21lX1JhbmdlXzEwMG1jcCwgc2hhcGU9U2V4KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaGFwZT1TZXgpLCBzaXplID0gNCwgcG9zaXRpb249cGQpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUhvbWVfUmFuZ2VfMTAwbWNwLXNlLCB5bWF4PUhvbWVfUmFuZ2VfMTAwbWNwK3NlKSwgcG9zaXRpb24gPSBwZCwKICAgICAgICAgICAgICAgIHdpZHRoPTAuMywgc2l6ZT0wLjUsIGx0eT0xKSArCiAgZmFjZXRfZ3JpZCh+U2Vhc29uLCBsYWJlbGxlcj1sYWJlbGxlcihTZWFzb249c2Vhc29uLmxhYnMpKSArCiAgIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjEwLC44NSksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0xLjUsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjUpLCBoanVzdCA9IDAuNSksCiAgICAgICAgIyBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArCiAgeGxhYigiIikgKyB5bGFiKCIxMDAlIE1DUCBBcmVhIChoYSkiKSAKCnJhdy5zZWFzb25hbApgYGAKCgoKCkZpZ3VyZXMgQWRqdXN0ZWQgRU1NcyBvZiBzZWFzb25hbCBob21lIHJhbmdlIGJldHdlZW4gdGhlIHR3byBwb3B1bGF0aW9ucwpgYGB7cn0KUk0ubW9kLlNlYXNvbiA8LSBsbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1NlYXNvbitTZXgrTitFbnZpcm9ubWVudCpTZWFzb24rKDF8R2lsYSksIGRhdGE9c2Vhc29uYWwpCgojIFJNLm1hcmdpbmFsLnNlYXMgPC0gbHNtZWFucyhSTS5tb2QuU2Vhc29uLAojICAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyBSTS5tYXJnaW5hbC5zZWFzCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fc2Vhc29uIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgc3BlY3MgPSBjKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpKQoKIyByZWZSTV9zZXgKcmVmX2RmUk1fc2Vhc29uIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShyZWZSTV9zZWFzb24pKQpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjIpCgojIHJlbGV2ZWwgZmFjdG9yIHNlYXNvbiBmb3IgZ3JhcGhpbmcgcHVycG9zZXM6CnJlZl9kZlJNX3NlYXNvbiRTZWFzb248LXJlbGV2ZWwocmVmX2RmUk1fc2Vhc29uJFNlYXNvbiwiRW1lcmdlbmNlIikKCiMgTmV3IGZhY2V0IGxhYmVsIG5hbWVzIGZvciBzZWFzb25zCiMgc2Vhc29uLmxhYnMgPC0gYygiRHJ5IiwgIkVtZXJnZW5jZSIsICJNb25zb29uIiwgIlBvc3QgTW9uc29vbiIpCiMgbmFtZXMoc2Vhc29uLmxhYnMpIDwtIGMoIkRyeSIsICJFbWVyZ2VuY2UiLCAiTW9uc29vbiIsICJQb3N0X01vbnNvb24iKQoKIyBzZWFzb24ubGFicyA8LSBjKCJFbWVyZ2VuY2UiLCAiRHJ5IiwgIk1vbnNvb24iLCAiUG9zdCBNb25zb29uIikKIyBuYW1lcyhzZWFzb24ubGFicykgPC0gYygiRW1lcmdlbmNlIiwgIkRyeSIsICJNb25zb29uIiwgIlBvc3RfTW9uc29vbiIpCgphZGouc2Vhc29uYWw8LWdncGxvdChyZWZfZGZSTV9zZWFzb24sYWVzKHg9RW52aXJvbm1lbnQsIHk9bHNtZWFuLCBzaGFwZT1TZXgpKSArIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlPVNleCksIHNpemUgPSA0LCBwb3NpdGlvbj1wZCwgc2hvdy5sZWdlbmQ9RkFMU0UpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMSwgMikpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCBwb3NpdGlvbiA9IHBkLAogICAgICAgICAgICAgICAgd2lkdGg9MC4zLCBzaXplPTAuNSwgbHR5PTEpICsgCiAgZmFjZXRfZ3JpZCh+U2Vhc29uLCBsYWJlbGxlcj1sYWJlbGxlcihTZWFzb249c2Vhc29uLmxhYnMpKSArCiAgdGhlbWVfYncoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTE4KSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksCiAgICAgICAgIyBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJOb24iLCAiU3ViIikpICsKICB4bGFiKCIiKSArIHlsYWIoIjEwMCUgTUNQIEFyZWEgKGhhKSIpCgphZGouc2Vhc29uYWwKYGBgCgoKQ29sbGVjdGl2ZSBncmlkIG9mIHJhdyBhbmQgYWRqdXN0ZWQgc2Vhc29uYWwgaG9tZSByYW5nZXMKYGBge3J9CmdnYXJyYW5nZShyYXcuc2Vhc29uYWwsIGFkai5zZWFzb25hbCwgbGFiZWxzID0gYygiQSIsICJCIiksCiAgICAgICAgICBucm93ID0gMikKYGBgCgoKCgpQb3N0IGhvYyBhbmFseXNlcyBvZiBzZWFzb25hbCBob21lIHJhbmdlcwoKUGFpcndpc2Ugb2YgZWFjaCBzZWFzb24gYmV0d2VlbiBwb3B1bGF0aW9ucywgb3ZlcmFnZWQgb3ZlciBsZXZlbHMgb2Ygc2V4CmBgYHtyfQplbW1fcy50IDwtIGVtbWVhbnMoUk0ubW9kLlNlYXNvbiwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNlYXNvbikKZW1tX3MudApgYGAKCkdyYXBoaWNhbCBjb21wYXJpc29ucwpgYGB7cn0KcGxvdChlbW1fcy50LCBjb21wYXJpc29ucyA9IFRSVUUpCmBgYAoKCgoKUGFpcndpc2UgYmV0d2VlbiBzZWFzb25zIHdpdGhpbiBlYWNoIHBvcHVsdGlvbiAKYGBge3J9CmVtbV9zLnQ0IDwtIGVtbWVhbnMoUk0ubW9kLlNlYXNvbiwgcGFpcndpc2UgfiBTZWFzb24gfCBFbnZpcm9ubWVudCkKZW1tX3MudDQKYGBgCgpHcmFwaGljYWwgQ29tcHMKYGBge3J9CnBsb3QoZW1tX3MudDQsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgCgoKClBhaXJ3aXNlIGJldHdlZW4gc2V4ZXMgb2YgZWFjaCBzZWFzb24gb2YgdGhlICBzdWJzaWRpemVkIHBvcHVsYXRpb24KYGBge3J9CnN1YiA8LSBzdWJzZXQoc2Vhc29uYWwsIEVudmlyb25tZW50ID09ICJzdWJzaWRpemVkIikKClJNLm1vZC5TdWIgPC0gbG1lcihIb21lX1JhbmdlXzEwMG1jcH5TZWFzb24rU2V4K04rU2Vhc29uKlNleCsoMXxHaWxhKSwgZGF0YT1zdWIpCgplbW1fcy50NSA8LSBlbW1lYW5zKFJNLm1vZC5TdWIsIHBhaXJ3aXNlIH4gU2V4IHwgU2Vhc29uKQplbW1fcy50NSAKYGBgCgpHcmFwaGljYWwgQ29tcHMKYGBge3J9CnBsb3QoZW1tX3MudDUsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgCgoKClBhaXJ3aXNlIGJldHdlZW4gc2V4ZXMgb2YgZWFjaCBzZWFzb24gb2YgdGhlICBub24tc3Vic2lkaXplZCBwb3B1bGF0aW9uCmBgYHtyfQpub25zdWIgPC0gc3Vic2V0KHNlYXNvbmFsLCBFbnZpcm9ubWVudCA9PSAibm9uc3Vic2lkaXplZCIpClZpZXcobm9uc3ViKQpSTS5tb2QuTlN1YiA8LSBsbWVyKEhvbWVfUmFuZ2VfMTAwbWNwflNlYXNvbitTZXgrTitTZWFzb24qU2V4KygxfEdpbGEpLCBkYXRhPW5vbnN1YikKCmVtbV9zLnQ2IDwtIGVtbWVhbnMoUk0ubW9kLk5TdWIsIHBhaXJ3aXNlIH4gU2V4IHwgU2Vhc29uKQplbW1fcy50NiAKYGBgCgpHcmFwaGljYWwgQ29tcHMKYGBge3J9CnBsb3QoZW1tX3MudDYsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgCgoKCgo=